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

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

 

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

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

<span style="background-color:#f5f5fa"><span style="color:#23263b"><code class="language-csharp"><span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">Shape</span>
{
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">virtual</span> <span style="color:#0000ff">double</span> <span style="color:#a31515">CalculateArea</span>()
    {
         <span style="color:#0000ff">return</span> <span style="color:#880000">0</span>;
    }
}

<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">Circle</span> : <span style="color:#a31515">Shape</span>
{
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">double</span> Radius { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }

    <span style="color:#0000ff">public</span> <span style="color:#0000ff">override</span> <span style="color:#0000ff">double</span> <span style="color:#a31515">CalculateArea</span>()
    {
        <span style="color:#0000ff">return</span> Math.PI * Radius * Radius;
    }
}

<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">Square</span> : <span style="color:#a31515">Shape</span>
{
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">double</span> SideLength { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }

    <span style="color:#0000ff">public</span> <span style="color:#0000ff">override</span> <span style="color:#0000ff">double</span> <span style="color:#a31515">CalculateArea</span>()
    {
        <span style="color:#0000ff">return</span> SideLength * SideLength;
    }
}</code></span></span>

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

抽象方法

<span style="background-color:#f5f5fa"><span style="color:#23263b"><code class="language-csharp"><span style="color:#0000ff">public</span> <span style="color:#0000ff">abstract</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">Shape</span>
{
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">abstract</span> <span style="color:#0000ff">double</span> <span style="color:#a31515">CalculateArea</span>();
}

<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">Circle</span> : <span style="color:#a31515">Shape</span>
{
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">double</span> Radius { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }

    <span style="color:#0000ff">public</span> <span style="color:#0000ff">override</span> <span style="color:#0000ff">double</span> <span style="color:#a31515">CalculateArea</span>()
    {
        <span style="color:#0000ff">return</span> Math.PI * Radius * Radius;
    }
}

<span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> <span style="color:#a31515">Square</span> : <span style="color:#a31515">Shape</span>
{
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">double</span> SideLength { <span style="color:#0000ff">get</span>; <span style="color:#0000ff">set</span>; }

    <span style="color:#0000ff">public</span> <span style="color:#0000ff">override</span> <span style="color:#0000ff">double</span> <span style="color:#a31515">CalculateArea</span>()
    {
        <span style="color:#0000ff">return</span> SideLength * SideLength;
    }
}</code></span></span>

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

总结

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

icwx_7550592

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值