C#与.net高级编程 C#的多态介绍
2024-09-07 17:05:24
供稿:网友
用virtual关键字标记的方法称为虚方法,如果子类希望改变虚方法的实现细节就必须使用 override关键字。
抽象类
abstract关键字
防止创建毫无意义的基本类,使用abstract关键字创建抽象基类,防止被实例化
使用abstract关键字创建抽象方法,强制每一个子类重写特定的方法,abstract成员没有提供任何实现。
(注:抽象方法只可以定义在抽象类中,如果不是这样的话,就会收到编译器错误)
成员投影
如果派生类定义的成员和定义在蕨类中的成员一致,派生类投影了父类的版本。
如:我们从一个不是自己创建的类来创建子类就是很可能发生这样的情况(基类和子类出现同一个方法名。)
解决方案:
使用override关键字更新父版本,但是如果我们对定义基类的代码没有访问权限,我们就不能将方法修改为虚方法。
我们可以为派生类型的成员添加new 关键字。这样就可以表明派生类型的实现故意设计为隐藏父类的版本。
封装、继承、多态,面向对象的三大特性,前两项理解相对容易,但要理解多态,特别是深入的了解,对于初学者而言可能就会有一定困难了。我一直认为学习OO的最好方法就是结合实践,封装、继承在实际工作中的应用随处可见,但多态呢?也许未必,可能不经意间用到也不会把它跟“多态”这个词对应起来。在此抛砖引玉,大家讨论,个人能力有限,不足之处还请指正。
之前看到过类似的问题:如果面试时主考官要求你用一句话来描述多态,尽可能的精炼,你会怎么回答?当然答案有很多,每个人的理解和表达不尽相同,但我比较趋向这样描述:通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态。
代码如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->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#的多态机制,也不是一件容易的事,有很多需要注意的地方。