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

 更新时间:2023年03月28日 10:44:24   作者:letmebaby  
这篇文章主要通过简单的示例为大家详细介绍一下C#中抽象方法与虚方法的区别,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下

抽象方法与虚方法的区别

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

如果需要了解虚方法及抽象方法具体的定义和语句,请移步: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#中抽象方法与虚方法的区别的文章就介绍到这了,更多相关C# 抽象方法 虚方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C# SQLite库使用技巧

    C# SQLite库使用技巧

    SQLite是一个开源、免费的小型RDBMS(关系型数据库),能独立运行、无服务器、零配置、支持事物,用C实现,内存占用较小,支持绝大数的SQL92标准。下面跟随小编一起看下C# SQLite库使用
    2022-01-01
  • C#中List集合使用Max()方法查找到最大值的实例

    C#中List集合使用Max()方法查找到最大值的实例

    这篇文章主要介绍了C#中List集合使用Max()方法查找到最大值的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Unity3D撤回命令开发详解

    Unity3D撤回命令开发详解

    这篇文章主要为大家详细介绍了Unity3D撤回命令开发,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C#定时器组件FluentScheduler用法

    C#定时器组件FluentScheduler用法

    这篇文章介绍了C#定时器插件FluentScheduler的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • c#中判断类是否继承于泛型基类

    c#中判断类是否继承于泛型基类

    这篇文章主要介绍了c#中判断类是否继承于泛型基类,最简单的办法肯定是typeof(b).baseType=typeof(a<string>)这样就可以返回true,但是这种方法时不妥的,下面看看如何解决这个问题呢
    2022-04-04
  • C# FileStream文件读写详解

    C# FileStream文件读写详解

    本文主要介绍C#使用 FileStream 读取数据,写入数据等操作,希望能帮到大家。
    2016-04-04
  • C#中Html.RenderPartial与Html.RenderAction的区别分析

    C#中Html.RenderPartial与Html.RenderAction的区别分析

    这篇文章主要介绍了C#中Html.RenderPartial与Html.RenderAction的区别分析,需要的朋友可以参考下
    2014-07-07
  • c#使用IAsyncEnumerable实现流式分段传输

    c#使用IAsyncEnumerable实现流式分段传输

    这篇文章主要为大家详细介绍了c#如何使用IAsyncEnumerable实现流式分段传输,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • C#3.0使用EventLog类写Windows事件日志的方法

    C#3.0使用EventLog类写Windows事件日志的方法

    这篇文章主要介绍了C#3.0使用EventLog类写Windows事件日志的方法,以简单实例形式分析了C#写windows事件日志的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C#实现二叉查找树

    C#实现二叉查找树

    本文详细讲解了C#实现二叉查找树的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论