1)继承基类的多态
class BaseClass { public virtual void DoSomething() { } } class SubClass { public override void DoSomething() { } }
BaseClass bClass=new SubClass(); bClass.DoSomething();
这种方式利用子类重写基类的虚方法,体现了IS-A风格的多态。
2)实现接口的多态
interface IAble { void DoSomething(); } class SubClass { public void DoSomething() { } }
IAble subClass=new SubClass(); subClass.DoSomething();
这种方式具有更高的灵活性,体现了一种CAN-Do的风格的多态。
.Net之所以能够使用多态,是因为.Net的动态绑定或晚期绑定机制成就的。
所谓动态绑定,就是在运行期通过检查虚拟方法表来确定是调用原始方法还是被覆写的方法。
比如说在此例中,编译器先检查subClass的声明类型是BaseClass或者IAble,然后看DoSomething方法是否被实现为虚方法。
如果不是虚方法,则直接执行;
如果是虚方法,则检查运行时类型SubClass类中对DoSomething方法的覆写或实现。如果有覆写,则调用此方法,如果没有,则向上寻找其父类,查找是否有覆写该方法,直到找到第一个覆写方法调用才结束。
其中,虚方法是一词是广义的,包含在父类中的virtual方法和接口中的方法。
--部分内容依据《你必须知道的.NET》一书P32-P33