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