我对UML中的泛化,聚合和抽象类有点困惑。
通过概括,我可以理解它是“是一个” - 关系。学生是人 - 而教师是人。所以人是超类,而学生和老师都是子类。
通过聚合,这就是我所理解的:与构图相比,它是一种“更柔和”的关系。一个例子可能是:你可以拥有一只没有手指的手(聚合),但你不能没有手的手指(组合)。
然后我完全迷失在抽象课上。抽象类有什么特点?如果可能的话,我想要一个例子。
但我在这里走在正确的轨道上吗?这就是我理解这些术语的方式。
答案 0 :(得分:1)
您了解泛化。
关联可以是聚合或组合(或两者都不)。这是Tom Pender过去常用的一个很好的例子。假设你有一个Car类。那辆Car级“有”方向盘,座椅,两个车轴,四个车轮等等。如果您在制造商环境中创建该车辆,那么所有车辆之间的关系将是组合:所有车辆零件(在您的制造商处)的寿命与车辆的使用寿命相关联。从制造商的角度来看,当您将其交付给经销商时,汽车及其所有部件的使用寿命即告结束。
现在,让我们假设您是垃圾场的所有者。在这种情况下,汽车仍然“拥有”所有这些部件,但它们有自己的生命周期:你可以从汽车上销售零件,如果你需要,甚至可以让它们成为其他汽车的一部分。汽车与这些零件之间的关系是聚合,因为零件的使用寿命与汽车本身的使用寿命无关。
所以,你可以看到同一辆车实际上可以根据上下文以两种不同的方式建模。
对于抽象类:抽象类只是一个定义方法和/或属性的类,同时要求它们只能在子类中实现。最简单的解释为什么使用接口。接口是抽象类,附加条件是NONE方法或属性可以直接在类中实现(您可能会说它是如何定义子类的定义)。这是他们有用的地方。
假设我想定义一个Animal类。动物做什么?好吧,他们搬家了。他们咬了一口。 (当然,他们也会做其他事情,但是我们坚持使用Move和Bite。)如果我创建一个Animal界面,我会说“这就是动物的行为。如果你想成为动物,你还必须做这些东西。但是,我不打算告诉你怎么做。“所以,我创建了一个iAnimal接口,有两种方法,Move和Bite。作为一个接口,我不提供任何类型的实现,只是空程序。
现在,假设我有两只动物,一只跳蚤和一只TRex。显然,Fleas和TRexes在移动方式或咬人方式上没有任何共同点,但他们都做到了。我将让Flea和TRex继承或“实现”界面,提供适合动物类型的Move和Bite的实现。
这样做的好处是我的跳蚤和trex的客户不必知道他们正在处理哪一个。他们可以创建一个iAnimal,根据需要注入一个Flea或TRex实例,并安全地调用iAnimal的Move和/或Bite方法,而不必担心它们是否受支持。 (这就是我们所说的“多态性”)。
因此,接口实现是一种泛化形式(更准确地说是专业化,另一种方式),正如您可能已经猜测的那样。
从这里开始,“抽象类”只是定义了任何必须继承以实现的方法或属性的类。因此,正如我所说,接口是抽象类。但是,在一般用法中,抽象类被认为是指不是接口的类,即。即一个具有一些具体方法或属性的人。大多数编程语言都遵循这个定义。