首页 > 编程语言 >C#中抽象方法与虚方法的区别详解及示例

C#中抽象方法与虚方法的区别详解及示例

时间:2023-03-27 17:02:13浏览次数:48  
标签:示例 C# 子类 Shape 详解 抽象 double 方法 public

1. 抽象方法与虚方法的区别

  先说两者最大的区别:抽象方法是需要子类去实现的。虚方法是已经实现了的,可以被子类覆盖,也可以不覆盖,取决于需求。因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不可能被实现。

如果需要了解虚方法及抽象方法具体的定义和语句,请移步:C#多态性学习,虚方法、抽象方法、接口等用法详解

我们具体看个例子来帮助理解,首先是虚方法

public class Shape
{
    public virtual double CalculateArea()
    {
         return 0;
    }
}

public class Circle : Shape
{
    public double Radius { get; set; }

    public override double CalculateArea()
    {
        return Math.PI * Radius * Radius;
    }
}

public class Square : Shape
{
    public double SideLength { get; set; }

    public override double CalculateArea()
    {
        return SideLength * SideLength;
    }
}

  在这个例子中,Shape类定义了一个虚方法CalculateArea(),它返回0。Circle和Square类分别继承Shape类并重写了该方法,实现了自己的计算面积的方法。

抽象方法

public abstract class Shape
{
    public abstract double CalculateArea();
}

public class Circle : Shape
{
    public double Radius { get; set; }

    public override double CalculateArea()
    {
        return Math.PI * Radius * Radius;
    }
}

public class Square : Shape
{
    public double SideLength { get; set; }

    public override double CalculateArea()
    {
        return SideLength * SideLength;
    }
}

  在这个例子中,Shape类定义了一个抽象方法CalculateArea(),因为它是一个抽象方法,所以没有提供实现。Circle和Square类继承Shape类并强制实现了该方法
  抽象类是无法被实例化的,但是它可以作为父类被继承。抽象类中可以定义抽象方法,子类必须实现这些抽象方法。这种方式也称为“强制静态绑定”。

总结

虚方法和抽象方法都是实现多态性的方式,但它们有以下几点不同:

  1.实现方式不同:虚方法是在父类中声明方法并使用virtual关键字标识,子类可以使用override关键字对该方法进行重写并实现自己的行为;而抽象方法是在父类中声明方法并使用abstract关键字标识,子类必须实现这些抽象方法。
抽象方法只能在抽象类中声明,虚方法不是。如果类包含抽象方法,那么该类也是抽象的,也必须声明类是抽象的。

  2.是否需要实现:虚方法可以有默认的实现,而抽象方法必须由子类进行实现。如果一个子类没有实现其父类中定义的所有抽象方法,则子类必须被声明为抽象类。

  3.类型限制:使用虚方法实现多态性时,代码会被解释为运行时代码,程序需要查找对象类型以确定调用的方法。使用抽象方法时,代码会被解释为静态代码,编译器会强制实现所有抽象方法。

  4.设计用途:虚方法适用于有默认实现的情况,且子类可能需要更改其行为的情况,例如重构代码时需要改变方法的实现。抽象方法适用于接口定义和强制子类实现该类的一些操作的情况。

总的来说,虚方法和抽象方法是实现多态性的两种不同方式,具体使用哪一种方式取决于代码的设计需要。虚方法允许子类通过重写方法实现自己的行为,而抽象方法通常用于定义接口和限制子类的操作。

标签:示例,C#,子类,Shape,详解,抽象,double,方法,public
From: https://www.cnblogs.com/letmebaby/p/17262016.html

相关文章

  • 【线程池】使用ThreadLocal请务必remove
    背景:在一次扫描中被提示:Field[SESSION_CONTEXT]oftypeThreadLocalmustcallremove()methodatleastonetimes.(line34)嗯?啥子情况?搜索了一下,发现:ThreadLo......
  • C#多态性学习,虚方法、抽象方法、接口等用法举例
    1.多态性定义  C#中的多态性是OOP(面向对象编程)的一个基本概念,它允许一个对象在不同情况下表现出不同的行为,以增强代码的可重用性和灵活性。  根据网上的教程,我们得......
  • 异常:Cannot execute request on any known server
    当在启动springcloud 微服务 provider时,如果出现异常信息:Cannotexecuterequestonanyknownserver,原因是,在默认设置下,eureka服务注册中心也会将自己作为客户端来......
  • Tomcat多实例与负载均衡
    一、Tomcat多实例第一步:放入安装关闭防火墙和selinux第二步:安装JDK并设置环境变量1)安装JKD2)编写java脚本设置JDK环境变量3)运行脚本文件,然后查看jdk版本......
  • C#中重写(override)及覆盖(new)的区别详解
    1.重写和覆盖的定义1.1重写(override)的定义  在C#中,用override关键字来重写一个父类中的虚方法或抽象方法。override关键字用于指示编译器,我要用派生类中的一个方法......
  • ChatGPT接入微信 C#完整源码
    1.无需搭建服务器2.winform运行程序扫码登录,就可以充当机器人调用chatGPT可实现自动回复(可以识别会话消息和群聊消息,拉入群聊@机器人可以进行群聊的消息回复),可以申请小......
  • 用netty实现dubboRPC
    Dubbo是一种基于Java的高性能RPC框架,使用Netty作为底层网络通信库。下面是使用Netty实现DubboRPC的示例代码:服务端代码:publicclassDubboRpcServer{privatefina......
  • 如何使用 CAA 记录防止错误签发 SSL 证书?
    什么是CAA?CAA(CertificationAuthorityAuthorization,证书颁发机构授权)是一项降低SSL证书错误颁发的控制措施,由互联网工程任务组(IETF)批准列为IETFRFC6844规范。2017......
  • ASEMI代理NXP汽车芯片MCIMX7D5EVM10SD
    编辑-ZMCIMX7D5EVM10SD系列处理器代表了恩智浦在满足低功耗需求的高性能处理和高度功能集成方面的最新成就。这些处理器的目标是不断增长的联网和便携式设备市场。 MCI......
  • ASEMI代理NXP汽车芯片MC34PF3001A7EP
    编辑-Z用于i.MX7和i.MX6SoloLite/SoloX/UltraLite处理器的电源管理集成电路(PMIC) MC34PF3001A7EP是一款SMARTMOS电源管理集成电路(PMIC),专为使用NXPi.MX7和i.MX6So......