一、类与类的关系:
类与类之间的关系有以下几种
- 继承
- 聚合
- 依赖
二、什么是继承
继承是面向对象中“类与类”的一种关系。
继承的的类 叫做子类、派生类
被继承的类 叫做父类、基类或者超类。
子类可以实现对基类的扩展和改写:
- 一是通过在子类中添加新方法
- 二是通过对父类方法的重新改写,既是覆写(override)
继承的本质:
- 继承是可以传递的,子类是对父类的扩展,必须继承父类方法,同时可以添加新方法
- 子类可以调用父类方法和子端,但父类不能调用子类的方法和字段
- 子类不光继承父类的公有成员,还继承了父类的私有成员,只是在子类中不被访问。
在.Net中,继承按照其实现的方式不同,分为以下类别:
- 实现继承:派生类继承了基类所有的属性和方法,并且只有一个基类,在.Net中,System.Object 是所有类型的最终基类,这种继承方式叫 实现继承。 实现继承通常情况下表现为抽象类的继承。
- 接口继承:派生类继承了接口的方法签名。
实现继承和接口继承的异同关系:
- 抽象类适合于有族层的类之间的关系;接口适合于为不同的类提供通用的功能
- 抽象类偏重于 IS-A 式的关系;而接口着重于Can-Do 的关系
- 抽象类多定义对象的属性;接口多用于定于对象的行为
- 如果预计会出现版本问题,如需要添加新的成员,可以创建“抽象类”;而往接口中添加新成员会强制要求修改所有的派生,并且重新编译。
- 值类型是密封的,所以只能实现接口而不能继承类
继承的缺点:
- 继承可能造成子类的无限膨胀,不利于类体系的维护和安全
- 继承的子类对象确定与编译期,无法满足需要运行期才能确定的情况,而类的聚合很好的解决了这个问题
- 随着继承层次的复杂化和子类的多样化,不可避免地回出现对父类的无效的继承或者有害继承。所以子类部分的继承父类的方法和属性,更能适应实际的设计需求。
三、关于Adapter模式
......
四、归纳总结
- 密封类(Sealed)不可以被继承
- 实现单继承,接口多继承
- 继承的层次应该有所控制,否则类型之间的关系维护会耗费很大的精力
- 继承关系中,我们更多的关注其共性而不是特性。共性是层次复用的基础,特性是系统扩展的基点。
- 从宏观来看,继承多关注于共同性,而多态着眼于差异性。
- 面向对象的基本原则: 多聚合 少继承 低耦合 高内聚