0

我一直在阅读 Java 和 oop 设计。其中一项练习是设计一个系统来保存天文物体及其一些基本属性。

该系统需要容纳恒星、星系和行星。

每个对象都有一个类型,例如星星;矮人,巨人和正常人

开始也有颜色。

到目前为止,我从一个名为 AstronomicalObject 的所有这些对象的抽象基类开始:

public abstract class AstronomicalObject {
  //Is this totally pointless?
}

然后我制作了 3 个类 Star、Galaxy 和 Planet 来扩展这个类。对于这些对象的每种类型,我都制作了额外的子类,即扩展 Star 的 DwarfStar。这是一个可以接受的想法吗?额外的类感觉有点多余:

public class DwarfStar extends Star{
  public final String SIZE = "DWARF";
  public DwarfStar(String colour) {
    super(colour);
  }
}

对于颜色属性,我这样做了:

public class Star extends AstronomicalObject{
  public final static String YELLOW = "YELLOW";
  public final static String RED = "RED";
  public final static String WHITE = "WHITE";
  public final static String SIZE = "NORMAL";
  private String colour;

  public Star(String colour) {
    this.colour = colour;
  }

  public String getColour(){
    return this.colour;
  }
}

所以要创建一个星形对象,我会使用:

DwarfStar ds = new DwarfStar(Star.YELLOW);

不幸的是,这本书没有答案页面或讨论这个练习,所以我想知道我的解决方案是否是有效的 oop 设计。或者如果它可以改进?

4

4 回答 4

3

这完全没有意义吗?

如果您的三个对象具有type您所说的 a ,那么不,它不是没用的,因为您将只能在超类中编写一个 setter 和 getter,而不是在每个子类中实现它。事实上,如果每个子类都具有共同的属性,那么超类就不是没用的。

然后对于颜色,您可以使用Enum而不是静态变量:

public enum Colours{
    YELLOW, RED, WHITE, NORMAL
}

并使用Colours.RED例如访问它们。

于 2012-04-12T19:36:11.590 回答
2

这是非常有效的,如果有的话,只是很小的改进。

这个AstronomicalObject类在这一点上似乎毫无意义,但如果你想在未来添加一些东西,或者如果你决定每个天文物体都有质量或形状或其他什么,就应该保留这个类。同样在更大的软件解决方案中,这可能是必要的。

于 2012-04-12T19:39:10.450 回答
2

我认为这是一个 OOP 练习,重要的是要考虑行星恒星和星系的共同点。也许颜色只适用于恒星和行星?大小呢?你可能想重做这个练习,更多地思考如何以这种方式描述你的类的属性

于 2012-04-12T19:40:20.193 回答
1

在 OO 设计中,组合的使用比继承更多。因此,aGalaxyStars 和Planets 组成。您的代码应该表明这一点。aPlanet总是属于一个单一的Star吗?如果是这样,那么你应该以某种方式显示出来。

其他答案指出,Star对于您给出的琐碎案例,子类型不是必需的,但如果您考虑了所有天文物体类别,则可能是这样。我认为只有在AstronomicalObject确实存在所有子类共有的某些功能或特征时才真正有必要。

听起来你刚刚开始,所以练习是让你熟悉组合和继承。对真实世界对象建模的 OO 设计练习的一个警告是,它们没有给您正在设计的软件的要求。然而,在制作面向对象设计模型时,这些要求非常重要。例如,如果您正在设计的软件应该对电枢望远镜用户可见的天体进行分类,则可能不需要为黑洞添加一个类(假设它们在电枢光学望远镜中不可见)可能是不必要的。

于 2012-04-13T02:23:48.067 回答