C# 多态

Polymorphism (C# Programming Guide)

面向对象编程有三个支柱:封装,继承和多态。

多态有两个显著特点:

List<Shape> shapes 为第一点,子类隐式转换为基类。

s.Draw(); 为第二点,CLR 发现基类这个方法为虚方法,则在继承链中查找 overide method,最终运行的是子类中的 override method。

virtual 关键字可以用于这些类成员 methods, properties, events,indexers,不能用于 fields。

若不使用 override 而是使用 new,子类只遮盖虚成员,不重写虚成员。

在继承链中,比如 C:B:A,不管 B 是否重写了虚成员,C 都可以重写。如果 B 使用了 sealed override 关键字重写,C 的子类 D 不能再重写了,只能用 new 遮盖。

子类可以用 base 关键字访问基类的虚成员。推荐在虚方法内调用基类的虚方法,不然要自己实现基类的虚方法的功能。

C# 所有 types 都是多态的,因为都继承自 System.Object,ToString 便是一个虚方法。