对于以下模型,您更喜欢继承还是组合:
- 我想在
canvas
每个代表一个数据对象的对象上绘制对象 - 把它想象成一个状态机图:
Ellipses
表示States
,Lines
表示connections/transitions
它们之间。对象表示本身永远不会改变,即 aState
将始终由 a 显示ellipse
。但是ellipse
绘制的方式应该不同,例如对于选择它应该有不同的颜色,而拖动它应该有一个 alpha 通道等。
从设计的角度来看, anellipse
不是 a state
, aline
也不是 a transition
。无论如何,将这两个对象组合起来是合适的,以便能够将它们收集在 a 中并在每个对象上List<Shape>
执行。shape.draw()
现在有 2 个设计模型是可能的,而我认为 2 个类总是相同的:
interface Shape {
void draw();
}
abstract class Figure implements Shape {
//basic vars like start and end coordinates
int x0, y0, x1, y1;
}
遗产:
abstract class State extends Figure {
String name;
}
class Rectangle extends State {
@Override void draw();
}
class Line extends Figure;
class Transition extends Line
尽管从设计的角度来看 arectangle
不是 a State
,并且 astate
也不是 a figure
,但关于绘图上下文,这可能是可行的。shapes
因为我可以继承处理、绘图等所需的大部分内容。
或组成:
abstract class State {
String name;
}
class Rectangle extends Figure {
private State state;
@Override void draw();
}
class Line extends Figure {
private Transition transition;
@Override void draw();
}
所以Rectangle
+Line
将是我的对象的包装器。
一个 Rectangle 和 Line 应该扩展 State 和 Transition,还是包含它?
或者,也许还有我没有看到的第三种设计选项。期待你的想法。