抽象方法
使用abstract关键字 public abstract bool Withdraw(…),没有方法体。
抽象方法必须被派生类重写。
任何类中,若存在抽象方法,这个类必须定义为抽象类(不过,里面可以不包含抽象方法)。===============================================================================
虚方法
使用virtual关键字 public virtual bool Withdraw(){....}(有自己的方法体);
是否重写——>随便你。
虚方法有自己的方法体,可在子类中重写。重写用new关键字(放在返回类型前面),重写后调用的是新的类成员。
虚方法重写后若要调用基类成员,需强转为基类实例。
例如:
DerivedClass B = new DerivedClass();
B.DoWork(); // Calls the new method.
BaseClass A = (BaseClass)B;
A.DoWork(); // Calls the old method.
虚函数的限制:
1.虚方法仅适用于有继承关系的类对象。
2.析构函数可以是虚函数。
3.简单点说,抽象方法是需要子类去实现的; 虚方法,是已经实现了,子类可以去改写,也可以不改写取决于需求。
C#中的虚方法使用virtual关键字定义
public virtual void eat();
override关键字作用是对父类的virtual方法进行改写
public override void eat();
虚方法,抽象方法 很多时候都用在 多态 这里!!
对于多态:
就是说 父类定义的 虚方法 ,如果有子类改写,那么 其不同子类的对象 优先调用各自的 改写方法,如果没改写,就调用父类的
打个比方:
父亲有一家公司,有良好的运营模式。
两个儿子 A B 分别开办了两个子公司。
A 儿子的公司,没有自己的 运营模式 ,于是在公司运营的时候,就使用自己父亲的公司的 运营模式。
B 儿子的公司,是一个 夜总会,父亲的 运营模式 就不适合了,B就改写了 一个新的 运营模式,那么就优先使用自己的 运营模式。
至于抽象方法,那就好比:父亲知道公司必须要有一个 运营模式。但父亲却没有自己的公司。于是,父亲寄希望于儿子,儿子们的公司,都必须实现 当初父亲构想的 运营模式。