一文带你了解C#中抽象方法与虚方法的区别

作者:letmebaby 时间:2023-07-23 00:14:32 

抽象方法与虚方法的区别

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

如果需要了解虚方法及抽象方法具体的定义和语句,请移步: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.设计用途:虚方法适用于有默认实现的情况,且子类可能需要更改其行为的情况,例如重构代码时需要改变方法的实现。抽象方法适用于接口定义和强制子类实现该类的一些操作的情况。

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

来源:https://www.cnblogs.com/letmebaby/p/17262016.html

标签:C#,抽象方法,虚方法
0
投稿

猜你喜欢

  • Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)

    2023-06-29 11:25:28
  • C#解析JSON实例

    2022-05-08 16:09:56
  • Spring框架学习之Cache抽象详解

    2023-07-20 17:37:47
  • Android笔记之:App应用之启动界面SplashActivity的使用

    2023-03-21 19:05:56
  • springmvc4+hibernate4分页查询功能实现

    2021-08-16 02:28:08
  • Flutter 分页功能表格控件详细解析

    2023-09-22 20:02:45
  • 使用Netty实现类似Dubbo的远程接口调用的实现方法

    2022-10-08 02:21:53
  • 详解Kotlin:forEach也能break和continue

    2022-05-03 01:24:10
  • c# 获得局域网主机列表实例

    2022-07-12 21:46:58
  • Android提高之使用NDK把彩图转换灰度图的方法

    2023-07-22 02:00:07
  • java实现微信红包 拼手气红包

    2023-09-28 10:31:45
  • DevExpress实现自定义TreeListNode的Tooltip的方法

    2022-08-19 05:39:47
  • 详解Java volatile 内存屏障底层原理语义

    2023-05-08 19:25:47
  • Java获取json数组对象的实例讲解

    2023-08-24 14:55:28
  • Android 实现沉浸式状态栏的方法

    2023-05-02 21:42:11
  • Android onKeyDown监听返回键无效的解决办法

    2023-01-27 16:02:55
  • 在C#中调用VBScript、javascript等脚本的实现代码

    2022-09-25 13:52:56
  • Java多线程Atomic包操作原子变量与原子类详解

    2023-08-18 07:46:25
  • Android提高之蓝牙传感应用实例

    2023-02-04 01:12:32
  • C#实现的SQL备份与还原功能示例

    2021-09-03 17:53:17
  • asp之家 软件编程 m.aspxhome.com