- 1、本文档共46页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
6 类的继承与多态 6. 类的继承与多态 面向对象编程(OOP)的三大特性: 封装性 继承性 多态性 本章主要介绍: 理解继承和软件继承性 理解基类和派生类的概念 理解成员修饰符protected 使用base引用访问基类成员 如何在基类和派生类中使用构造和析构函数 通过一个案例,演示继承机制 6.1 继承概述 继承是软件复用的一种形式。采用这种形式,可吸收现有类的数据和行为,为其赋予新功能,从而创建出新类。软件复用节省了程序开发时间。它还鼓励人们重用经过实践检验和调试的高质量软件,使系统能高效地实现。 6.2 基类和派生类 日常生活中,一个类的对象也是另一个类的对象。 如,一个Rectangle(矩形)类“属于”四边形(正方形、平行四边形和梯形同样是四边形)。也可以说,Rectangle(矩形类)是从Quadrilateral(四边形)类继承而来的。 Quadrilateral类是基类, Rectangle类是派生类。 再如,教师类和学生类可以由大学成员类派生,讲师、教授又可以由教师类派生,毕业生和在校生又可以由学生类派生。 6.3 保护成员和内部成员 前面介绍了成员访问修饰符:public和private public成员,可以从程序的任何位置,通过该类(基类或派生类)的对象引用,来访问它。 private成员,只能在基类的主体中访问它 再介绍另外两个成员访问修饰符: protected(保护的)成员,只能在基类和它的派生类中访问。 internal(内部的)成员,可以从同一个程序集(Assembly)中,通过类的对象引用,来访问它。 6.4 基类和派生类的关系 6.4.1:Point类 Point类演示 6.4.2 Circle类 Circle类:没有使用继承 Circle类:没有使用继承 Circle类演示 使用类继承 以上两个类(Point类和Circle类)中的大部分代码非常类似。程序员最怕的是“重复”劳动,难道需要使用这种“复制”和“粘贴”的方法吗?这将会造成程序员最害怕的“代码维护噩梦”。 我们要用一种更优雅的类构造方法,该方法突出了继承的优势。下面的例子说明了这一点。 我们修改Circle类,该类从Point类继承了变量x和y,及属性X和Y。注意C#语法中是如何实现类继承的。 Circle类:使用继承 Circle类:编译出错? 为什么编译会出错?如何改正? 修改过的Point类 这时,使用继承的Circle类可以正常运行了 使用protected成员带来的相关问题 如同以前使用public一样,在基类中使用protected成员,会破坏基类的封装性。因为派生类在使用基类的成员,不知道存在哪些约束,可能会在派生类中给这些基类成员赋予了无效的值。 另外一个问题是,派生类的实现可能会依赖于基类。如果基类的成员发生了变化,可能会导致它所有的派生类都会发生改变。 将基类字段声明为private而非protected,能使程序员在更改基类实现时,不必更改派生类的实现。 如有可能,要避免在基类中包括受保护数据,相反,应使用非私有属性和访问私有数据的方法,确保对象维持一致性的状态。 Circle类:继承自Point类 在派生类中,如何访问基类的私有成员呢? 通过基类中对外公开的属性或方法。 使用base引用进行访问 通过下页的示例代码和演示大家可以看到这一点。 Circle类:继承自Point类 Circle类演示 6.4.3 案例演示:三级继承层次结构 让我们来看一个更现实的继承示例,它牵涉到一个三级的Point-Circle-Cylinder层次结构 Cylinder类:定义字段与属性 Cylinder类:构造函数 Cylinder类:定义方法 Cylinder类演示 6.4.4 类的多态性演示 更新后的Circle类和Cylinder类 6.5 类的多态性 上一课的示例Poin-Cirlce-Cylinder,我们简单演示了类的多态性。 多态性是一个面向对象的概念,它允许以相似的方式来对待所有 的派生类,尽管这些派生类是各不相同的。创建派生类的目的是为了获得更多的特殊功能。 通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性 在Poin-Cirlce3-Cylinder示例中,计算圆面积的方法与计算圆柱体的表面积的方法是不相同的,但都可以通过Area( )方法进行计算,不同对象的Area( )方法是不相同的,但对于调用者来说,使用很方便(既可以用派生类调用Area( )方法,也可以用基类调用Area( )方法),因为调用者无需知道计算细节有何不同。 6.5.1 基本概念 所谓多态,就是把派生类对象当成基类对象来使用。换句话说,就是认为派生类对象是(
文档评论(0)