1

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

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

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

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

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

编辑:当默认背景通过包含对象(例如Canvas?(Canvas 包含多个 Shapes 实例)在基类上建模抽象类需要我更新Circle和的每个实例Square

4

3 回答 3

1

只需添加一个abstract方法getDefaultBackgroundColor()Shape在每个子类中覆盖它以返回适当的颜色。这样,您将能够确定任意实例的默认背景颜色,这是使用您提到Shape的方法无法做到的。static

于 2013-07-10T17:33:17.060 回答
1

您可以getDefaultColor()在 Shape 中使用一个,并在 Circle 和 Square 中覆盖它以返回其特定的默认颜色。那里不需要静态方法。

在其他情况下,这将是一个有用的功能:假设您想要返回默认图像,而不是简单的颜色。在这种情况下,您将实现类似

形状.java:

public abstract Image getDefaultImage();

Circle.java(扩展形状):

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 缺乏静态方法覆盖(或元类的概念),因此这是通常在需要时实现的方式。

于 2013-07-10T17:33:33.093 回答
1

您可以创建一个 ShapeInfo 类。每个实例都将引用一个 Shape 子类并为该类提供背景颜色。静力学更容易,可能是要走的路,但这将使您能够拥有多组具有不同背景的 Circle 实例。此外,您可以扩展 ShapeInfo 类来为 Circle 和 Square 提供更好的子类。

如果 Circle 和 Square 成为高度复杂的类,并且被许多其他类加入,并且如果您有很多代码想要将它们都视为 Shape 实例,那么这种技术会变得相当有用。

于 2013-07-11T16:57:46.593 回答