在面向对象设计中为类特定属性建模的最佳方法是什么?
例如,在画布上绘制的元素的设计可以建模如下:
Shape
|
|
+-------------+
| |
| |
Circle Square
我们需要为Circle
和Square
指定默认背景颜色。一种方法是将它们定义为static
属性。
是否有用于建模此类关系的对象模式?
编辑:当默认背景由Canvas
等包含对象频繁更改时,如何建模这样的模式? (Canvas包含Shapes的多个实例)
在基类上建模抽象类需要我更新Circle
和Square
的每个实例。
答案 0 :(得分:1)
只需将abstract
方法getDefaultBackgroundColor()
添加到Shape
并在每个子类中覆盖它以返回相应的颜色。这样,您就可以确定任意Shape
实例的默认背景颜色,这是使用您提到的static
方法无法做到的。
答案 1 :(得分:1)
您可以在Shape中使用getDefaultColor()
,并在Circle和Square中覆盖它以返回其特定的默认颜色。那里不需要静态方法。
在其他情况下,它将是一个有用的功能:假设您想要返回默认图像而不是简单的颜色。在这种情况下,您将实现类似
的内容Shape.java:
public abstract Image getDefaultImage();
Circle.java(扩展Shape):
private static Image staticCircleImage = null;
public Image getDefaultImage() {
if (staticCircleImage == null) staticCircleImage = createStaticCircleImage();
return staticCircleImage;
}
Square.jave(扩展形状):
// same as above, but with staticSquareImage instead...
由于Java缺少静态方法覆盖(或元类的概念),因此通常在需要时实现它。
答案 2 :(得分:1)
您可以创建一个ShapeInfo类。每个实例都引用一个Shape子类,并为该类提供背景颜色。静态更容易,可能还有很长的路要走,但这可以让你有几组具有不同背景的Circle实例。此外,您可以扩展ShapeInfo类,以便为Circle和Square提供更好的子类。
如果Circle和Square变成高度复杂的类,并且被许多其他类加入,并且如果你有很多代码想要将它们全部视为Shape实例,那么这种技术会变得非常有用。