1、六、初识继承和多态 (1)继承概述 在C#中类可以继承自另一个类 衍生的类(子类)继承父类的方法和数据成员 子类不仅是具有自己度有的成员,还具有父类的成员 继承关系在类图中表示一个空心箭头,箭头指向的是父类 子类构造函数: ①隐式的调用父类的构造函数: 自动调用父类中无参构造函数 适用于仅当父类中有无参构造函数时 ②显示调用父类构造函数: 相当于隐式调用父类构造函数 public 子类名 (形参列表):base(实参列表){} base关键字: 显示调用父类构造函数 子类中成员名称与
2、父类中成员名称向冲突时使用:base父类成员名称 访问修饰符的区别; 类内部 子类 其他类 Public 可以 可以 可以 private 可以 不可以 不可以 protected 可以 可以 不可以 多态 不同对象对于同一个方法实现不同的行为 简单定义:同一种行为具有不同表现 分类: 编译时多态:指同一类的不同对象对于同一个消息(方法)做出不同的响应, 方法重载 编译时确定,速度快,效率高,不灵活 运行时多态: 指两个或多个不
3、同类的对象对于同一个消息(方法)做出不同的响应 虚方法,抽象方法,借口 运行时确定,速度慢,效率低,灵活 重写虚方法实现多态 第一步:父类中定义虚方法virtual 第二步:子类中使用override重写父类中的虚方法(虚方法可以被传递下去) 第三步:调用 父类 父类对象 = new 子类();父类对象.虚方法名(); (2)继承的使用 继承的传递性 继承单根性 (3)继承的好处 模拟现实世界的关系 实现了代码的重用 代码结构清晰 (4)对象的关系 is a 是
4、一个表达继承关系 has a 有一个 表达包含关系 运行顺序:子类è父类è父类的实现è子类的实现 继承一定有:共性和特性 软件开发中继承的妙处: 模拟现实世界的关系 便于重用和扩展彻底测试的代码且无需修改 结构更清晰 开闭原则(对扩展打开,对修改关闭) 各尽其职,共同协作 As 用来转换è对象名 as 类名 虚方法一定要有virtual 和方法体 七、深入了解多态 (1)里氏替换原则和多态应用 里氏替换原则(LSP) 在一个软件系统中,子类对象可以替换所有使用的父类对象,且程序没有变化: 抽象方法
5、虚方法 用abstract修饰 用virtual修饰 不允许有方法体 有方法体哪怕是一个分号 必须被子类重写 可以被子类重写 只能在抽象类中 除密封类都可以写 子类的对象能替换父类 父类对象不能替换子类 父类方法都要在子类中实现或重写 重点体现Is 和as操作符 (2)抽象类和抽象方法 抽象类用来举例一个类所需要的行为 抽象类不明确提供具体实现方法 抽象类必须由子类实现它的抽象方法(除非子类也是抽象类) 抽象方法:一个没有实现的方法 有抽象方法的类一定是抽象类 抽象方法和虚方法的区别:
6、 (3)面向对象的三大特性 封装:隐藏内部实现,稳定外部接口 继承:子类继承父类成员,实现代码复用 多态:不同子类对同一个消息作出不同的反应 new:实例化、、、、隐藏父类的同名方法 在同一个类中方法相同参数不同(个数,类型)è在继承中两个类也可以实现方法重载 子类以父类身份出现 子类以父类身份出现,子类所表现的行为都是父类的行为 子类以父类身份出现,子类所特有的行为是无法访问的 As只能作用于引用类型,值类型报错 将父类变量定义为传递参数 声明父类,实例的是子类 抽象类: 没有实现的方法称为抽象
7、方法(abstract) 必须被子类重写,除非子类也具有抽象性 不能是静态的 虚方法 抽象方法 除了sealed类 只能放在抽象类中 一定要有方法体 不能有方法体 可以被子类重写 必须被子类重写 不可以被子类的子类继承 可以被子类的子类继承(子类必须是抽象类) Sealedè密封类 只允许继承别人不能被继承 抽象方法和虚方法的区别: 父类能被实例化就用虚方法,反之,抽象方法 父类提供一系列规定,约束子类行为 八、面向对象高级应用 (1)设计模式概述 设计模式是软件开
8、发过程中经验的积累 特定问题的经过实践检验的特定解决方法 (2)设计模式的应用 简单工厂设计模式 应用场合:创建的具体对象经常变化 一个类有N个子类 一个类有N个接口实现 操作步骤: 第一步:编写父类,并定义虚方法或抽象方法 第二步:编写具体子类,并重写父类中的虚方法或抽象方法 第三步:编写工厂类并修饰为抽象类,定义静态方法 第四步:调用 父类 对象 = 父类名 factory.Create父类名(实例列表) Public abstract class ctor
9、y { Public static 父类名 Create(构造对象的所需的所有参数列表,string type) { { 父类名 obj = null; Switch(type) { Case “abc”: Obj = new 子类名(); Break; } Return obj; } } } 单例设计模式: 确保某一个类只有一个实例,而且自行实例化并向整个系统中提供这个实例 操作步骤: 判断哪个类需要单例 构造函数私有化 定义一个private static 类型(类名)本身成员变量 定义一个 public static 返回类型是本身的类名 修改你new的调用 设计模式的意义: 提高软件的可重用性 灵活适应软件设计的变化 面向对象在实际应用中集中表现






