- 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#支持运行时多态性。多态性是面向对象程序设计的基础,因为它允许基类指定其派生类所公有的方法,同时允许派生类定义这些方法中的一些或全部的特殊实现。 基类能够定义方法(将由其所有派生类使用)的通用形式。基类提供派生类能够直接使用的所有元素,它还定义了那些派生类必须在其自身上实现的方法,这给派生类提供了定义其自身方法的灵活性。 将虚方法应用到TwoDShape6类中。在下面的示例中,从TwoDShape6派生的每个类都定义了方法area()。这表明将TwoDShape6类的area()方法定义为虚方法将更合适,以允许每个派生类过载他们并定义如何计算类所封装的形状的面积。为方便起见,给TwoDShape6添加一个name属性。 抽象类 有时基类只定义其派生类共享的通常化形式,而让派生类来填充具体内容,当基类不能创建方法的有意义实现时,可能会出现该方法仅仅是一个占位符。例如TwoDShape6.cs中TwoDShape类中的area()方法。为了确保派生类真正过载所有必要的方法,C#的解决方案是使用抽象类。 抽象类:指基类只能作为一个为它的所有派生类而存在的一个支撑“骨架”,而不提供任何具体实例化的代码 抽象类声明格式 abstract class 类名 { //抽象类的成员定义 } 注 抽象类只能作为其他类的基类,它不能直接被实例化,而且对抽象类不能使用new操作符。抽象类如果含有抽象的变量或值,则它们要么是null类型,要么包含了对非抽象类的实例的引用。 抽象类允许包含抽象成员,虽然这不是必须的。 抽象类不能同时又是密封的 抽象方法 使用abstract类型修饰符能够创建抽象方法。抽象方法不包含方法主体,因此基类不能实现它。所以,派生类必须过载它,而不能仅仅使用由基类定义的版本。抽象方法默认为虚拟类型,而无须使用virtual修饰符。实际上同时使用virtual和abstract是错误的。 抽象方法基本形式: abstract type name(parameter-list) 使用抽象方法注意点: 抽象方法没有方法主体。abstract修饰符只能使用于普通方法,不能应用于static方法 包含一个或多个抽象方法的类也必须声明为抽象的 派生类继承抽象类时,它必须实现基类中所有的抽象方法,否则,派生类也必须指定为abstract类型,直到获得完整的实现 通过使用抽象类,可以改进TwoDShape类。由于未定义的二维图形没有确切的面积概念,因而可以将TwoDShape类中的area()声明为abstract类型,让TwoDShape派生的所有类都必须过载area()。 注意点: 1、所有派生类都必须过载area()方法。 2、对于不是abstract类型的方法,派生类仍可以正常使用。 密封类 虽然继承具有强大功能,而且使用广泛,但有时需要防止继承,如果所有的类都可以被继承,继承的滥用使类的层次结构体系将变得十分庞大,类之间的关系杂乱无章,对类的理解和使用都会变得十分困难。 密封类在声明中使用sealed修饰符,这样就能防止该类被其他类继承。 同时将类声明为abstract类型和sealed类型是非法的,因为抽象类自身是不完整的,需要依赖其派生类来提供完整的实现。 定义密封类格式 abstract class A?{ ?public abstract void F( ) ;?}?sealed class B: A?{ ?public override void F( ) ? { // F 的具体实现代码 }?} 如果尝试写下面的代码? class C: B{ } C#会指出这个错误,告诉你B 是一个密封类,不能试图从B 中派生任何类。 密封方法 防止在方法所在类的派生类中对该方法的重(过)载 对方法使用sealed修饰符,这时我们称该方法为密封方法 不是类的每个成员方法都可以作为密封方法,密封方法必须对基类的虚方法进行重载,提供具体的实现方法。所以,在方法的声明中,sealed修饰符总是和override修饰符同时使用 using System; class A { public virtual void F() { Console.WriteLine(A.F); } public virtual void G() { Console.WriteLine(A.G); } } clas
文档评论(0)