UML 中的接口和抽象 Class 聚合

Interface and Abstract Class Aggregation in UML

我被分配了一个任务,我必须在其中实现一个模拟太阳系的小程序,该太阳系有太阳和行星绕行,并且行星必须有卫星绕行。我已经成功地实现了动画,但是为了获得完整的分数,我们需要使用以下 UML:

我了解该框架有一个 Sun 的实例,并且 Sun 实现了接口 Orbit 中的方法,并且有一个 OrbitingBody 的实例是用Planet 构造函数,等等...我不理解的是 UML 中接口 Orbit 和抽象 class OrbitingBody 之间的关系。

/****************************************************************/
import java.awt.*;

@SuppressWarnings("serial")
public class Sun implements Orbit {
    private Dimension dim;
    private OrbitingBody earth;
    private OrbitingBody mars;
    //Other vars

    public void init(Dimension dim) {
        // CODE irrelevant for the question
    }

    public void setPlanetPosition() {
        // CODE irrelevant for the question
    }

    public int calX(int distance, int angle){
        // CODE irrelevant for the question
    }
    public int calY(int distance, int angle){
       // CODE irrelevant for the question
    }

    public void draw(Graphics g) {
        // CODE irrelevant for the question
    }
}


/****************************************************************/
import java.awt.*;

@SuppressWarnings("serial")
public class Planet extends OrbitingBody implements Orbit {
    private Moon moon;
    private Moon eris;


    Planet(int x, int y, Color color) {
        super.x = x;
        super.y = y;
        moon = new Moon();
        eris = new Moon();
        this.color = color;
    }

    public int calX(int distance, int angle){
        // CODE irrelevant for the question
    }
    public int calY(int distance, int angle){
        // CODE irrelevant for the question
    }
}



/****************************************************************/
  public interface Orbit {
    int calX(int distance, int angle);
    int calY(int distance, int angle);
}



/****************************************************************/
   import java.awt.*;

public abstract class OrbitingBody {
    protected Color color;
    protected int x, y;
    protected int radius = 25;

    void setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void draw(Graphics g) {
        // CODE irrelevant for the question
    }
}

我能理解你的困惑。

我自己无法理解 UML 图的用途(我以此为生)。

UML 图存在问题

  • 每个关联使用 聚合(关联末尾的空心菱形)。聚合表示整体部分关系。我在图中的任何关联中都看不到这一点。 PlanetSun 的一部分,还是 MoonPlanet 的一部分?

  • «Orbit»{Orbiting Body} 的 UML 符号是错误的。我猜 Orbit 是一个接口?在这种情况下,正确的表示法是要么使用棒棒糖表示法,要么使用名称前带有关键字 «interface» 的标准框。至于Orbiting Body,大括号只是在UML中用来表示约束。我又猜想你的老师是想指出一个摘要class?在那种情况下,正确的方法是使用斜体作为名称,因此 Orbiting Body

  • 'Orbiting Body' 和 'Orbit' 之间的聚合没有任何意义。正如现在所写,OrbitOrbiting Body 的一部分。我能理解 Orbiting BodyOrbit

    之间是否存在正常关联
  • 'Orbiting Body and 'Orbit的关联方向与SunPlanetPlanet的关联方向相反Moon。我认为实现 OrbitOrbiting Body 的 classes 之间的关联将是对该关联的某种重新定义,但在那种情况下,方向需要相同。 (并且还需要指出重新定义)。
    按照现在的设计,应该有两个关联,您需要实现 SunPlanet 之间以及 PlanetMoon 之间的关联。每个方向一个。

我建议您忽略实际 UML 图的细节,因为它不一致并使用您自己的判断。程序员不应该只是一个用代码翻译 UML 的盲目代码猴。您应该独立思考并(如果可能)挑战 and/or 改进分析。

您的代码中的问题:

  • 想想如何实现Orbiting Bodies(Planet,Moon)和Orbits(Sun,Planet)之间的关系。
    • 你需要哪个方向的?
    • 您是一般层面需要还是只需要具体层面
  • 为什么您的 Planet class 上有两个 Moon 类型的属性?。 Planet 不能超过 2 个 Moon 吗?我希望得到某种 Moons
  • 的列表
  • 您的 Sun class 关于 Planet 的相同评论。