.net 中多态的理解

请各路高手阐述下自己所理解的多态,学了都快1年了,忽然发现竟然解释不出多态是什么。先谢谢了!欢迎都来讨论啊... 请各路高手阐述下自己所理解的多态,学了都快1年了,忽然发现竟然解释不出多态是什么。先谢谢了!欢迎都来讨论啊 展开
 我来答
匿名用户
2013-04-06
展开全部
首先理解一下什么叫多态。同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态性通过派生类覆写基类中的虚函数型方法来实现。 多态性分为两种,一种是编译时的多态性,一种是运行时的多态性。编译时的多态性:编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。运行时的多态性:运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中运行时的多态性是通过覆写虚成员实现。 下面我们来分别说明一下多态中涉及到的四个概念:重载,覆写,虚方法和抽象方法。重载和覆写的区别:重载类中定义的方法的不同版本 public int Calculate(int x, int y) public double Calculate(double x, double y)特点(两必须一可以) 方法名必须相同 参数列表必须不相同 返回值类型可以不相同覆写 子类中为满足自己的需要来重复定义某个方法的不同实现。 通过使用override关键字来实现覆写。 只有虚方法和抽象方法才能被覆写。 要求(三相同) 相同的方法名称 相同的参数列表 相同的返回值类型最后再来介绍一下虚方法和抽象方法虚方法:声明使用virtual关键字。调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。虚方法可以有实现体。
抽象方法:必须被派生类覆写的方法。可以看成是没有实现体的虚方法。如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法。
注意:昨天突然发现c#,和c++俩种语言在多态性的 实现机制 上面的细微差别。

如果是C++,在基类的构造函数里面调用虚函数的话,会调用本类的不会调用派生类的,原因是基类构造的时候,虚表还没有被派生类继承和修改。 但如果是C#,那就不同了,在基类的构造函数里面照样调用派生类的。不知道有谁知道c#它的这种底层机制是怎样的?
-------是这样的,C++会先初始化基类,然后逐级初始化派生类型。C#则是一开始就把对象创建好了,然后逐个调用构造函数。本质区别在于C++的构造函数的任务是初始化,C#则不然,C#的类型的任何字段不必初始化,均有默认值,所以C#在调用构造函数之前就已经将对象初始化完毕了。通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性。C#中的每种类型都是多态的。类型可用作它们自己的类型或用作Object实例,因为任何类型都自动将Object当作基类型。

多态性不仅对派生类很重要,对基类也很重要。任何情况下,使用基类实际上都可能是在使用已强制转换为基类类型的派生类对象。基类的设计者可以预测到其基类中可能会在派生类中发生更改的方面。例如,表示汽车的基类可能包含这样的行为:当考虑的汽车为小型货车或敞篷汽车时,这些行为将会改变。基类可以将这些类成员标记为虚拟的,从而允许表示敞篷汽车和小型货车的派生类重写该行为。
匿名用户
2013-04-06
展开全部
多态分重载,重写和隐藏。重载就是函数名称相同,参数个数或类型不同。重写就是子类把父类的方法覆盖掉了,父类的方法不存在了,只有子类的方法了。(关键字 override,申明一下 父类的方法必须是虚方法或者抽象方法还能被重写)隐藏是子类和父类写了同一个方法,但是方法体不同,和重写的区别就是,父类的方法还存在没被覆盖掉,但是被隐藏起来了,必须用关键字base.父类方法调用。(关键字 new )以上是个人理解,如有雷同,实属巧合。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蔡金桂cai
2013-04-05
知道答主
回答量:42
采纳率:0%
帮助的人:16.7万
展开全部
多态的表现形式有两种:
1:重载,形式上是指方法名相同,参数列表不同,调用后编译器根据参数来判断是调用的那一个方法。
如:add(int num1,int num2)
{
return num1+num2;
}
add(int num1,duable num2)
{

return num1+num2;
}
2:重写,是指在子类中重写父类中的方法
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zweiking
2013-04-05 · TA获得超过319个赞
知道小有建树答主
回答量:104
采纳率:0%
帮助的人:46.2万
展开全部
所谓 多态 最直接的 表现 就是 在子类继承父类的 时候 可以 使用 override覆盖 父类中定义的 虚方法~~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式