Welcome

首页 / 软件开发 / C# / C#的面向对象特性:多态

C#的面向对象特性:多态2014-10-01多态 当初刚学C#的时候经常听说,但一直都不懂,想必对于很多初学者也是如此吧!

多态表示不同的对象可以执行相同的动作,但要通过他们自己的实现代码来执行。

看到执行执行相同的操作,我们都会想到继承,其实多态也就是继承,只不过高于继承,子类继承父类,继承了父类的方法,但是怎么样把这个方法真正变成自己的,也就是说通过自己的代码实现来执行,这里我们就需要了解一些概念:虚方法和重写

为了使子类的实例完全接替来自父类的成员,父类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加virtual关键字来实现的。通常虚拟的是方法,但其实除了字段不能是虚拟的,属性、事件和索引器都可以是虚拟的。尽管方法可以是虚拟的,但虚方法还是有方法体,表现父类的行为。然后,子类可以选择使用override关键字,将父类实现替换为子类自己的实现,这就是方法重写Override,或者叫做方法覆写。

看一下代码:

class Animal{public string Name { get; set; }public Animal(string name){Name = name;}public virtual void Shout(){Console.WriteLine("我是父类 ");}}class Cat : Animal{public Cat(string name): base(name){ }public override void Shout(){Console.WriteLine("我的名字叫" + Name);} }class Dog : Animal{public Dog(string name): base(name){}}
static void Main(string[] args) { Animal animal1 = new Cat("小猫"); Animal animal2 = new Dog("小狗"); animal1.Shout(); animal2.Shout(); Console.ReadKey(); }
运行是

我们可以看到子类如果重写了父类的方法,那么调用的就是自己的方法,如果没有重写,实现的还是父类的行为。

另外我们还要注意一点,这个对象的声明必须是父类,而不是子类,实例化的是子类,这才能实现多态。多态的原理是当方法被调用时,无论对象是否被转换为父类,都只有位于对象继承连最末端的方法实现会被调用,也就是说,虚方法会按照其运行时,而非编译时进行动态绑定调用的。