java – UML中的接口和抽象类聚合

我得到了一个任务,我必须实现一个模拟太阳系的小程序,太阳系有行星绕行星运行,行星必须有行星绕行星运行.我已经成功实现了动画,但为了获得完全的功劳,我们需要使用以下UML:

   

我知道框架有Sun的一个实例,而Sun在Orbit接口中实现了这些方法,并且有一个用Planet构造函数创建的OrbitingBody实例,依此类推……我不想要的是UML中的关系接口Orbit和抽象类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图的问题

>对每个关联使用聚合(关联结束时打开菱形).聚合表示整个部分关系.我没有在图上的任何关联中看到它.行星如何成为太阳或月球的一部分?
>«Orbit»和{Orbiting Body}的UML符号是错误的.我猜测轨道是一个接口?在这种情况下,正确的表示法是使用棒棒糖表示法,或者在名称前使用关键字“interface”的标准框.对于轨道体,大括号仅用于UML以指示约束.我再次猜测你的老师是想表明一个抽象的课程?在这种情况下,正确的是使用斜体作为名称,所以轨道体
>’轨道体’和’轨道’之间的聚合没有任何意义.正如现在所写,轨道是轨道运动的一部分.我能理解轨道体与轨道之间是否存在正常关联
>“轨道体和轨道”之间关联的方向与太阳与行星与行星和月球之间的关联相反.我认为实现Orbit和Orbiting Body的类之间的关联将是对该关联的某种重新定义,但在这种情况下,方向必须是相同的. (并且还需要重新定义).
正如它现在设计的那样,你应该有两个协会来实现太阳与星球之间以及星球与月球之间的联系.每个方向一个.

我建议你忽略实际UML图的细节,因为它不一致并使用你自己的判断.程序员应该是一个无意识的codemonkey,在代码中翻译UML.您应该自己思考并(如果可能的话)挑战和/或改进分析.

代码中的问题:

>考虑如何实现轨道物体(行星,月球)和轨道(太阳,行星)之间的关系.

>你需要哪个方向?
>您是在一般级别还是仅在具体级别需要它

>为什么Planet类上有两个Moon类型的属性?一颗行星不能有超过2个月亮吗?我期待某种月亮列表
>关于Planet的Sun课程相同的评论.

点赞