抽象方法是只有定义、没有实际方法体的函数,它只能在抽象类中出现,并且在子类中必须重写;
public class Animal
{
public abstract void Sleep();
public abstract void Eat();
}
public class Cat : Animal
{
public override void Sleep()
{
Console.WriteLine("Cat is sleeping");
}
// we need implement Animal.Eat() here
}
public class Animal
{
public abstract void Sleep();
public abstract void Eat();
}
public class Cat : Animal
{
public override void Sleep()
{
Console.WriteLine("Cat is sleeping");
}
// we need implement Animal.Eat() here
}
编译器会报错:
因为我们没有实现抽象类中所有抽象方法。
public class Cat : Animal
{
public override void Sleep()
{
Console.WriteLine("Cat is sleeping");
}
public override void Eat()
{
Console.WriteLine("Cat is eating");
}
}
抽象方法是必须被派生类覆写的方法。
抽象方法是可以看成是没有实现体的虚方法。
如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法。
虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖。
namespace ConsoleApplication3
{
using System;
class Program
{
static void Main(string[] args)
{
A a;
a = new B();
Console .WriteLine (a.Write());
Console.WriteLine(a.Read());
Console.ReadLine();
}
}
public class A
{
public virtual double Write()
{
double numberA = 0;
return numberA;
}
public virtual double Read()
{
double numberB = 1;
return numberB;
}
}
public class B : A
{
public override double Write()
{
double numberA = 0;
numberA = 9 + 5;
return numberA;
}
}
public class C : A
{
public override double Write()
{
double numberA = 0;
numberA = 9 - 5;
return numberA;
}
}
***运行结果为14,1 ***
调用虚方法,运行时将确定调用对象是什么类的实例(class B or class C),并调用适当的覆写的方法。
虚方法可以有实现体,一个虚拟方法的实现可以由派生类取代。取代所继承的虚拟方法的实现的过程称为重写该方法。
虚函数的限制:
1.虚函数仅适用于有继承关系的类对象, 所以只有类的成员函数才能说明为虚函数.
2.静态成员函数不能是虚函数.
3.内联函数不能是虚函数.
4.构造函数不能是虚函数.
5.析构函数可以是虚函数.
简单点说,抽象方法是需要子类去实现的。虚方法,是已经实现了,子类可以去覆盖,也可以不覆盖取决于需求。
虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢?
1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。
2. 抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。
3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。(没有重写Read)