序:本篇为前段时间的个人总结,如果对我的总结有异议请在回复中指出
1依赖
在软件设计中,依赖关系一般体现在了继承上,所以以下就对继承的几个方面讲讲。
1.1接口
在c#中,通过关键字
一般而言作为多继承的时候是属于结构上的需求,结构上的东西都是一开始就计划好了,然后再书写,所以这种接口会出现在项目初期,也就是编码的最开始
例如:水果是植物,水果是食物
如果水果同时集成了食物和植物的特性,由于C#机制不允许水果对多个类进行继承
这个时候就会用到植物的接口或者是食物的接口
而作为限制外部访问的接口属于功能型的接口,这种接口一般都是在后期出现的,而其原因大致如下
例如我们有一个动物对象:狗 他有很多动作 吃(eat()),休息(sleep()),散步(walk())。。。。。。
而我想把吃(eat())这个功能交给饲养员来处理,我又不想让饲养员知道能够调用休息(sleep()) ,散步(walk())这些方法
这时候我就只有给饲养员一个接口(喂食)调用吃(eat())这个方法
很显然,这个是因为有要提供给饲养员给狗(喂食) 这个功能 才会出现对外提供一个为(喂食)的接口
属于结构范围之外的,所以这个一般是在编码完成之后,维护期出现的。
1.2抽象类
在c#中,通过关键字abstract
在功能上抽象类和接口的区别仅仅在于:接口可以多重继承,而抽象类不行,接口不能提供方法的实现,而抽象类可以提供实现。
其主要作用体现在:为代码复用和抽象接口提供可能。
本质上:抽象类是结构级的。
1.3实体类
在功能少和抽象类的区别是少了可以抽象的部分,类下的方法都包含实现。
并不包含抽象部分。
1.4区别和联系
在功能上的区别和联系
多重继承 | 方法的实现 | 方法的抽象 | |
接口 | 可以 | 不行 | 可以 |
抽象类 | 不行 | 可以 | 可以 |
实体类 | 不行 | 可以 | 不行 |
应用上的区别和联系
- 接口:在结构上提供了多重继承的可能,同时也能让外部调用方法影响达到最小化。不过接口多用于外部的调用,使外部调用变得灵活,在继承的特性上不强求父与子的关系。
- 抽象类:在结构上提供了抽象和实现同时存在的可能,在抽象方法里的实现功能多体现于让子类对其方法的复用,达到代码的精炼,而在抽象方面体现的是接口的特性,让子类来提供实现,而自己制定标准。在继承的特性上强调父与子的关系。
- 实体类:一般在结构的最末级,用于实现功能。
2聚合
2.1关联
关联,表示就是一个简单的引用,只体现一种引用的关系。
如:class A中引用了class B、C、D的实例。
2.2聚合
聚合,表示整体和部分的关系。
如:class A中包含了几个部分:B、C、D,它们之间的关系比较弱,也就是说A对象不存在了,但是B、C、D对象仍然可以存在。
2.3复合
复合,表示是一种特殊的聚合,更多表示的是一种“拥有”的关系。
如class A中包含了几个部分:B、C、D,它们之间的关系比较强,如果A对象不存在了,则B、C、D对象也会不存在;如果拷贝了A对象,则B、C、D对象也会跟着一起拷贝。
2.4区别和联系
A存在BCD存在 | A存在BCD不存在 | A不存在BCD存在 | |
关联 | 可以 | 可以 | 可以 |
聚合 | 可以 | 不可以 | 可以 |
复合 | 可以 | 不可以 | 不可以 |
3依赖和聚合的关系及其区别
在用法上,接口和聚合没有交叉点,这2者的交叉点主要表现在了特性是由继承来表现还是由组合来表现。
在设计上继承强调的是复用,而组合强调的是变化。
继承表示的状态和类的数量关系为加的关系,及类的数量等于自后表现的状态的总和,而组合表现的状态和类的关系为,如果聚合的类为n1,n2...,每个类的种类为Na1,Na2...那么最终表示的状态的总类为相称的关系,及状态=(n1×Na1)×(n2×Na2)。。。。这点区别可以在桥接模式里体现出来。
参考文献:
.NET设计模式系列文章 作者:李会军