【发布时间】:2011-02-05 12:46:25
【问题描述】:
在 UML 图中,类什么时候应该是抽象的?就在我们想要阻止实例化的时候?
编辑:一个抽象类能否完全实现一个方法(当方法只依赖于该抽象类的属性时)?
【问题讨论】:
标签: abstract-class uml
在 UML 图中,类什么时候应该是抽象的?就在我们想要阻止实例化的时候?
编辑:一个抽象类能否完全实现一个方法(当方法只依赖于该抽象类的属性时)?
【问题讨论】:
标签: abstract-class uml
防止实例化是一个实现问题,因此如果您正在考虑 Java、C# 等方面的问题,这是一个很好的理由。
然而,在建模的层面上,如果有多个子类,你会想要使一个类抽象,并且 没有意义 一个对象是超类型但不属于任何一个子类型。
所以,基本上你不会阻止类的实例化,因为子类的任何实例也是抽象超类的实例。在这种情况下,您正在做的是阻止超类的实例化单独,即强制使用其中一种子类型。
回答编辑:是的!
【讨论】:
如果一个类有一个或多个抽象操作,那么它就是抽象的。
在UML中用斜体或{abstract}表示摘要。
下图(在 Martin Fowler 我的 UML Distilled 第三版书的第 70 页)显示了如何以及为什么要表示摘要:
【讨论】:
抽象类 a 是基本的 OOP 概念,所以我认为您的问题不是特定于 UML。
这里有一个关于何时使用抽象类的问题:
基本上,当多个类共享一组功能但该功能没有意义或本身不完整时,您应该使用抽象类。只有抽象类才能包含抽象方法,供后代实现。
例如,您可能希望将基本的 FileLogger 和 EmailLogger 功能提取到 Logger 类中,但是由于它本身没有意义,因此您只需将其抽象化即可。
【讨论】:
当您有多个具有相同功能的类时,一个类应该是抽象的,但每个此类的某些方法与超类(抽象类)不同。
例如一只动物。每个动物类都有方法 isAlive()。这种方法对所有动物都是平等的。 每个动物都有方法 move(target)。但每一种动物的移动方式都不同。你不能笼统地谈论动物的运动。有些动物会飞,有些会游泳,有些会跑。
【讨论】:
Animal 总是可以用来表达这个概念 =)
当您尝试表达子类化时,例如当您想要明确时,Cat 是 Animal 的一种特殊情况。
例如,Animal 可以对某些行为进行一些基本实现,例如 Eat,可以在子类上重写。
【讨论】:
抽象类与普通类一样,只是它允许您在没有方法体的情况下定义方法头。
这允许派生类有自己的实现,而基类没有自己的实现。
【讨论】:
一个抽象类意味着你可以维护一个方法或变量的列表(默认情况下在抽象类中是公共静态最终的)这会强制扩展这个抽象类的类来实现那些在声明的抽象类中没有实现的方法,(抽象类与接口有很高的相似度,但唯一的区别是接口是100%抽象类)。
【讨论】: