- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
面向对象方法中多态机制研究
面向对象方法中多态机制研究
[摘要]研究面向对象方法中的多态机制,明晰了C#语言中的new、override修饰符的真正作用。
[关键词]polymorphism new override
中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2008)0320041-01
一、引言
多态(polymorphism)的字面含义就是“同一个东西有许多不同的形态”。[1]
在面向对象的软件技术中,使用诸如下列多态概念定义:
“同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性”。
“多态性是一种使算法通用化的手段。能够只利用不同类中各个对象的共同属性来操作这些对象而不管这些对象所属的确切类。”[2]
而且在C#教程中的多态章节,对new、override修饰符的作用的解释使用了可能相同,也可能变化多样的词汇。这些都使学习者对面向对象方法中的多态机制感到困惑。
详析面向对象软件技术中的多态和涉及的相关概念和C#语法,使对学习者来说多态机制是可理解和记忆的。
二、继承与多态
(一)继承
广义地说,继承是指能够直接获得已有的性质和特征,而不必重复定义它们。在面向对象的软件技术中,继承是子类自动地共享基类中定义的数据和方法的机制。
继承经常被描述为一种“是一”(is a)的关系。“is a”关系指出,一个对象类中的每一个对象是另一对象类中的一个对象。
如图所示,我们把A称为超类或称为一般类;相似地,把B称为子集或称为特殊类。
面向对象软件技术的许多强有力的功能和突出的优点,都来自于把类组织成一个层次结构的系统(类等级):一个类的上层可以有父类,下层可以有子类。一个类直接继承其父类的全部描述(数据和操作)。
C#代码示例:
public class A
{
public operationA() {}
}
public class B : A
{
public operationB() {}
}
(二)多态
新类(即派生类)具有两个有效类型:新类的类型和它继承的类的类型。
在上面的示例中,类B既是有效的B,又是有效的A。访问B对象时,可以使用强制转换操作将其转换为A对象。强制转换不会更改B对象,但您的B对象视图将限制为 A 的数据和行为。将B强制转换为A后,可以将该A重新强制转换为B。并非A的所有实例都可强制转换为B,只有实际上是B的实例的那些实例才可以强制转换为B。如果将类B作为B类型访问,则可以同时获得类A和类B的数据和行为。对象可以表示多个类型的能力称为多态性[3]。在UML中,通过在超类和子类中显示特定的服务(操作)来表示多态。
通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性。C#中的每种类型都是多态的。类型可用作它们自己的类型或用作 Object类型,因为任何类型都自动将Object当作基类型。
多态性不仅对派生类很重要,对基类也很重要。任何情况下,使用基类实际上都可能是在使用已强制转换为基类类型的派生类对象。基类的设计者可以预测到其基类中可能会在派生类中发生更改的方面。例如,表示汽车的基类可能包含这样的行为当考虑的汽车为小型货车或敞篷汽车时,这些行为将会改变。基类可以将这些类成员标记为虚拟的,从而允许表示敞篷汽车和小型货车的派生类重写该行为。
public class BaseClass{public void DoWork() {}
public int WorkField;
public int WorkProperty
{get {return 0}public class DerivedClass : BaseClasspublic new void DoWork() {} //这个函数是新的,屏蔽了具有相同原型的继承来的函数
public new int WorkField;
public new int WorkProperty
{get {return 0}
使用了new关键字后,派生类中的基类成员成为隐藏成员。
如果将派生类的实例强制转换为基类的实例(“is a”关系),就仍然可以调用隐藏类成员。例如:
DerivedClass B = new DerivedClass(); //B是对新建的派生类对象的引用
B.DoWork();//调用新方法
BaseClass A = (BaseClass)B;//看到的是B中由继
文档评论(0)