在OO设计中建模类特定属性

时间:2013-07-10 17:31:00

标签: class oop object

在面向对象设计中为类特定属性建模的最佳方法是什么?

例如,在画布上绘制的元素的设计可以建模如下:

                                 Shape
                                   |
                                   |
                            +-------------+
                            |             |
                            |             |
                          Circle       Square

我们需要为CircleSquare指定默认背景颜色。一种方法是将它们定义为static属性。

是否有用于建模此类关系的对象模式?

编辑:当默认背景由Canvas等包含对象频繁更改时,如何建模这样的模式? (Canvas包含Shapes的多个实例) 在基类上建模抽象类需要我更新CircleSquare的每个实例。

3 个答案:

答案 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实例,那么这种技术会变得非常有用。