虚方法和抽象方法的区别

在查阅资料的过程中,偶然看到了虚方法和抽象方法,对其做个小结。

        

对比学习:

虚方法必须有实现部分,抽象方法不可以有实现部分;

虚方法可以在派生类中重写也可以不重写,抽象方法必须在派生类中重写;

虚方法可以在任何非密封类中声明,抽象方法只能在抽象类中声明;

如果类包含抽象方法,那么该类也必须为抽象的,不能实例化。


EXAMPLE(只为说明问题,未必恰当):

比如有个基类“鸟类”,两个子类“鸡”和“鸭”。

鸡叫:咕咕。

鸭叫:呱呱。

鸡飞:扑棱翅膀,短距离飞行。

鸭飞:扑棱翅膀,长距离飞行。


对于”叫“这个方法,完全不同。就可以把叫声明为抽象方法,基类只声明此方法来作约束,强制子类实现。


CODE(C#)


Birde类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstractAndVirtual
{
    abstract class Bird
    {
        public abstract void Sing();
    }
}

Chicken类:

<pre name="code" class="csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstractAndVirtual
{
    class Chicken : Bird
    {
        public override void Sing()
        {
            Console.WriteLine("咕咕");
        }
    }
}

 

Duck类:

<pre name="code" class="csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstractAndVirtual
{
    class Duck : Bird
    {
        public override void Sing()
        {
            Console.WriteLine("呱呱");
        }
    }  
}

 

客户端:

<pre name="code" class="csharp">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AbstractAndVirtual
{
    class Program
    {
        static void Main(string[] args)
        {
            Bird chicken = new Chicken();
            chicken.Sing();
            Bird duck = new Duck();
            duck.Sing();

            Console.Read();
        }
    }
}

 

对于“飞”这个方法,它们有共性也有区别,就可以把飞声明为虚方法,基类里实现共性部分,各子类实现个性部分。


CODE(C#)

Bird类:

namespace AbstractAndVirtual
{
    class Bird
    {
        public virtual void fly()
        {
            Console.WriteLine("挥动翅膀");
        }

    }
}

Chicken类:

namespace AbstractAndVirtual
{
    class Chicken : Bird
    {
        public override void fly()
        {
            Console.WriteLine("扑棱翅膀");
            Console.WriteLine("短距离飞行");
        }
    }
}

Duck类:

namespace AbstractAndVirtual
{
    class Duck : Bird
    {
        public override void fly()
        {
            Console.WriteLine("扑棱翅膀");
            Console.WriteLine("长距离飞行");
        }
    }  
}

客户端:

namespace AbstractAndVirtual
{
    class Program
    {
        static void Main(string[] args)
        {
            //Bird chicken = new Chicken();
            //chicken.Sing();
            //Bird duck = new Duck();
            //duck.Sing();

            Bird chicken = new Chicken();
            chicken.fly();
            Bird duck = new Duck();
            duck.fly();

            Console.Read();
        }
    }
}

有兴趣的话实现一下以上代码,很有意思。看到这里,相信大家都能理解虚方法和抽象方法的区别了吧。


评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值