【问题标题】:Interface and Abstract Class Aggregation in UMLUML 中的接口和抽象类聚合
【发布时间】:2018-09-09 02:00:54
【问题描述】:

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

我知道框架有一个Sun的实例,Sun实现了接口Orbit中的方法,并有一个OrbitingBody的实例用Planet构造函数创建,等等.. . 我不明白的是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
    }
}

【问题讨论】:

  • questions not to be asked Minimal, Complete, and Verifiable example 添加您的代码,您尝试了什么。
  • 在天体动力学的标准假设下,两个天体的重心是两个轨道的焦点。与天文学有关的轨道天体(有时称为 OB)是任何小于其轨道天体的物体。这些可能包括但不限于彗星、行星、矮行星、卫星和小行星。 en.wikipedia.org/wiki/Orbiting_body 所以月球绕地球运行并且比地球小,这意味着月球是与地球相关的轨道物体。地球绕太阳运行也是如此,并且比太阳小,在这种情况下,地球是太阳的轨道物体,明白了吗?
  • 我从作业中理解了所有内容,功能方面已完成,我遇到问题的部分是实现 UML 的设计 ONLY 通过接口 @987654333 实现关系 deacribes @ 和抽象类 OrbitingBody。这是我需要澄清的唯一标准

标签: java interface uml abstract-class


【解决方案1】:

我能理解你的困惑。

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

UML 图的问题

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

  • «Orbit»{Orbiting Body} 的 UML 表示法是错误的。我猜Orbit 是一个接口?在这种情况下,正确的表示法是使用棒棒糖表示法,或者使用名称前带有关键字«interface»的标准框。至于Orbiting Body,大括号仅在UML中用于表示约束。我又猜想你的老师是指抽象课?在这种情况下,正确的方法是使用斜体作为名称,所以 Orbiting Body

  • “轨道体”和“轨道”之间的聚合没有任何意义。正如现在所写的那样,OrbitOrbiting Body 的一部分。我可以理解Orbiting BodyOrbit 之间是否存在正常关联

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

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

代码中的问题:

  • 考虑如何实现轨道体(PlanetMoon)和轨道(SunPlanet)之间的关系。
    • 您在哪个方向需要它?
    • 您需要在一般级别还是仅在具体级别
  • 为什么在Planet 类中有两个Moon 类型的属性? Planet 不能有超过 2 个 Moons 吗?我期待某种Moons 列表
  • 关于PlanetSun 类的相同评论。

【讨论】:

  • Geert,虽然我同意您的大部分担忧,但根据 UML 规范的空心菱形“表示该属性具有共享聚合语义。共享聚合的精确语义因应用程序领域和建模者而异。” (第 110 页)。
  • @ThomasKilian 我知道,但我们都知道它是聚合,常见的用途是它表示整体关系。你的 qoute 上面的一段说:有时一个属性用于模拟一个实例用于将一组实例组合在一起的情况;这称为聚合。为了表示这种情况,Property 具有 AggregationKind 类型的聚合属性;
  • 这意味着“共享和复合的聚合”(双关语)。
  • 很可能(因为图表无论如何都是错误的)它们需要填充菱形。一个行星只是一个有它的太阳的行星,一个月亮只有一个有它的行星的月亮。没有它们就只是石砖。
  • @ThomasKilian 我认为它们应该只是简单的关联(AggregationKind = none)。我看不到太阳与其行星之间或行星与其卫星之间的任何类型的整体/部分关系(共享或复合)。
猜你喜欢
  • 2015-02-23
  • 2012-11-06
  • 2011-07-14
  • 2023-04-10
  • 2021-12-17
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 2014-04-12
相关资源
最近更新 更多