天津通用网站建设方案,广西seo排名,06628 网页制作与网站开发,中国制造网官方网站下载安装封装、继承、多态#xff0c;面向对象的三大特性#xff0c;前两项理解相对容易#xff0c;但要理解多态#xff0c;特别是深入的了解#xff0c;对于初学者而言可能就会有一定困难了。我一直认为学习OO的最好方法就是结合实践#xff0c;封装、继承在实际工作中的应用随…封装、继承、多态面向对象的三大特性前两项理解相对容易但要理解多态特别是深入的了解对于初学者而言可能就会有一定困难了。我一直认为学习OO的最好方法就是结合实践封装、继承在实际工作中的应用随处可见但多态呢也许未必可能不经意间用到也不会把它跟“多态”这个词对应起来。在此抛砖引玉大家讨论个人能力有限不足之处还请指正。 之前看到过类似的问题如果面试时主考官要求你用一句话来描述多态尽可能的精炼你会怎么回答当然答案有很多每个人的理解和表达不尽相同但我比较趋向这样描述通过继承实现的不同对象调用相同的方法表现出不同的行为称之为多态。 例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()方法时表现出了不同的行为。 多态的实现看起来很简单要完全理解及灵活的运用c#的多态机制也不是一件容易的事有很多需要注意的地方。 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关键字进行修饰即可。 3. abstract-override实现多态 先在我们在来讨论一下用abstract修饰的抽象方法。抽象方法只是对方法进行了定义而没有实现如果一个类包含了抽象方法那么该类也必须用abstract声明为抽象类一个抽象类是不能被实例化的。对于类中的抽象方法可以再其派生类中用override进行重写如果不重写其派生类也要被声明为抽象类。看下面的例子。 例4 代码 public abstract class Animal { public abstract void 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); } } 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 Cat(); animals[1] new Dog(); animals[2] new WolfDog(); for (int i 0; i animals.Length; i) { animals[i].Eat(); } } } 运行结果为 Cat eat... Dog eat... Wolfdog eat... 从上面可以看出通过使用abstract-override可以和virtual-override一样地实现多态包括多层继承也是一样的。不同之处在于包含虚拟方法的类可以被实例化而包含抽象方法的类不能被实例化。 以上就是我对c#中多态的一些浅薄的认识如有错误的地方欢迎批评指正转载于:https://www.cnblogs.com/Areas/archive/2012/12/05/2803784.html