多态的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多态:对于多态的实现,有三个关键字new,virtual,override的使用,多态可以简单的理解为对不同的对象调用相同的方法,表现出不同的行为,这种特性是通过继承来实现的。

例1:

public class Animal

{

public virtual void Eat()

{

Console.WriteLine("Animal eat");

}

}

public class Cat : Animal

{

public override void Eat()

{

Console.WriteLine("Cat eat");

}

}

public class Dog : Animal

{

public override void Eat()

{

Console.WriteLine("Dog eat");

}

}

class Tester

{

static void Main(string[] args)

{

Animal[] animals = new Animal[3];

animals[0] = new Animal();

animals[1] = new Cat();

animals[2] = new Dog();

for (int i = 0; i < 3; i++)

{

animals[i].Eat();

}

}

}

输出如下:

Animal eat...

Cat eat...

Dog eat...

在上面的例子中,通过继承,使得Animal对象数组中的不同的对象,在调用Eat()方法时,表现出了不同的行为。

1. new的用法

例2:

public class Animal

{

public virtual void Eat()

{

Console.WriteLine("Animal eat");

}

}

public class Cat : Animal

{

public new void Eat()

{

Console.WriteLine("Cat eat");

}

}

class Tester

{

static void Main(string[] args)

{

Animal a = new Animal();

a.Eat();

Animal ac = new Cat();

ac.Eat();

Cat c = new Cat();

c.Eat();

}

}

运行结果为:

Animal eat...

Animal eat...

Cat eat...

可以看出,当派生类Cat的Eat()方法使用new修饰时,Cat的对象转换为Animal对象后,调用的是Animal类中的Eat()方法。其实可以理解为,使用new 关键字后,使得Cat中的Eat()方法和Animal中的Eat()方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。所以, Animal类中的Eat()方法不管用还是不用virtual修饰,也不管访问权限如何,或者是没有,都不会对Cat 的Eat()方法产生什么影响(只是因为使用了new关键字,如果Cat类没用从Animal类继承Eat()方法,编译器会输出警告)。严格的说,不能说通过使用new来实现多态,只能说在某些特定的时候碰巧实现了多态的效果。

2.override实现多态

真正的多态使用override来实现的。回过去看前面的例1,在基类Animal 中将方法Eat()用virtual标记为虚拟方法,再在派生类Cat和Dog中用override 对Eat()修饰,进行重写,很简单就实现了多态。需要注意的是,要对一个类中一个方法用override修饰,该类必须从父类中继承了一个对应的用virtual修饰的虚拟方法,否则编译器将报错。

好像讲得差不多了,还有一个问题,不知道你想没有。就是多层继承中又是怎样实现多态的。比如类A是基类,有一个虚拟方法method()(virtual修饰),类B继承自类A,并对method()进行重写(override修饰),现在类C又继承自类B,是不是可以继续对method()进行重写,并实现多态呢?看下面的例子。例3:

运行结果为:

public class Animal

{

public virtual void Eat()

{

Console.WriteLine("Animal eat");

}

}

public class Dog : Animal

{

public override void Eat()

{

Console.WriteLine("Dog eat");

}

}

public class WolfDog : Dog

{

public override void Eat()

{

Console.WriteLine("WolfDog eat");

}

}

class Tester

{

static void Main(string[] args)

{

Animal[] animals = new Animal[3];

animals[0] = new Animal();

animals[1] = new Dog();

animals[2] = new WolfDog();

for (int i = 0; i < 3; i++)

{

animals[i].Eat();

}

}

}

Animal eat...

Dog eat...

WolfDog eat...

在上面的例子中类Dog继承自类Animal,对方法Eat()进行了重写,类WolfDog又继承自Dog,再一次对Eat()方法进行了重写,并很好地实现了多态。不管继承了多少层,都可以在子类中对父类中已经重写的方法继续进行重写,即如果父类方法用override修饰,如果子类继承了该方法,也可以用override 修饰,多层继承中的多态就是这样实现的。要想终止这种重写,只需重写方法时用sealed关键字进行修饰即可。

相关文档
最新文档