EA&UML日拱一卒--类图::泛化(generalization)

类和类之间,除了存在关联/聚合/组合这种协作关系以外,还有泛化关系,也就是C++中的继承关系。


定义


泛化是指一个较特殊的类到一个较普通的类之间的关系。较特殊的类也叫子类(subclass);较普通的类也叫超类(superclass)。子类继承了超类的所有特性(属性和操作),任何使用超类的地方,都可以用子类代替。


表示法


泛化表示为从子类到超类的实线,超类端带有空心三角形。


EA&UML日拱一卒--类图::泛化(generalization)_第1张图片



在 本例中,File类的功能已经很完整,可以独立使用,但是我们需要支持文本文件和Utf文件的行读写功能,于是增加了两个子类TextFile和 Utf8File,它们一方面完整继承了File的所有特性,一方面又为用户提供了利用者需要的读写文本文件和Utf8文件的便利功能。


这 种泛化关系虽然可以满足利用者的需求,但是没有人会在使用File的地方替换使用TextFile或者Utf8File,而是把它们作为另外的类来使用。 还有一点:很难找到漂亮的方法避免用户使用File类的Write/Read方法带来的混乱。可以说这种泛化是没有经过认真设计的泛化,或者说是被动的泛 化。


抽象类和具象类


还有另外一种情况,在设计时就考虑好超类,子类的分工,共同的部分由超类实现,特殊的部分由子类实现。


EA&UML日拱一卒--类图::泛化(generalization)_第2张图片


在 上图中,图形尺寸,位置的处理由Shpe类负责;表示的部分则在Shape定义Show操作,具体的Show方法由各个子类实现。因为Shape类没有实 现所有的功能,所以不应该被实例化。关于这一点,UML提供了方法,就是将Shape定义为抽象类。在EA中表示为斜体的类名。设定方法是在类属性的 【detail】页中,选中Abstract选项。具体如下图:


EA&UML日拱一卒--类图::泛化(generalization)_第3张图片


在这种场景下,我们称Shape为抽象类(abstract class),各子类为具象类(concrete class)。




如果阅读本文能给您带来些许收获,欢迎分享给更多的朋友!

阅读更多新文章,请扫描下面二维码,关注公众号【面向对象思考】

EA&UML日拱一卒--类图::泛化(generalization)_第4张图片

你可能感兴趣的:(UML)