虚函数在C#中实现多态
首先,多态是指不同对象收到相同消息时,会产生不同动作。从而实现“一个借口,多种方法”。
C#的两种多态-----编译时多态(通过方法重载和运算符重载实现)
-------------------运行时多态(通过虚方法(virtual)实现)---virtual修饰符不能与修饰符static、abstract、和ovveride一起使用。
普通方法重载要求方法名相同,参数类型和参数个数不同;而虚方法重载要求方法名称、方法类型、方法参数数量、方法参数顺序、方法返回值类型都必须与基类中的虚方法完全一样。
虚方法实现多态:
class Base { public void Display() { Console.WriteLine("Display in Base"); } public virtual void Print()//定义虚方法 { Console.WriteLine("Print in Base"); } } class Derived : Base { new public void Display() { Console.WriteLine("Display in Derived"); } public override void Print()//重载虚方法 { Console.WriteLine("Print in Derived"); } } class Program { static void Main(string[] args) { Base b = new Base(); Derived d = new Derived(); b.Print(); d.Print(); b.Display(); d.Display(); b = d; b.Print(); d.Print(); b.Display(); d.Display(); } }
在这里Base类的实例b被赋予Derived的实例d,那么b.Print()是调用基类的方法还是派生类的方法呢? 很明显这是在运行时确定的。。。。所以根据B在某一时刻所调用的对象来确定调用哪个,体现了多态。而对虚方法Display是在编译时确定的。。。所有无论如何b.display都是调用Base类的方法。
世事洞明皆学问,勿以善小而不为!