虚方法和抽象方法的区别

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

        

对比学习:

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

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

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

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


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类:

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类:

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("呱呱");
        }
    }  
}
 
  

客户端:

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();
        }
    }
}

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


你可能感兴趣的:(---------【设计模式】)