在查阅资料的过程中,偶然看到了虚方法和抽象方法,对其做个小结。
对比学习:
虚方法必须有实现部分,抽象方法不可以有实现部分;
虚方法可以在派生类中重写也可以不重写,抽象方法必须在派生类中重写;
虚方法可以在任何非密封类中声明,抽象方法只能在抽象类中声明;
如果类包含抽象方法,那么该类也必须为抽象的,不能实例化。
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();
}
}
}
有兴趣的话实现一下以上代码,很有意思。看到这里,相信大家都能理解虚方法和抽象方法的区别了吧。