我接到了一项作业,其中我必须实现一个小程序来模拟一个太阳系,该太阳系有一个太阳和行星围绕,并且行星必须有卫星围绕行星运行。我已经成功地实现了动画,但为了获得完整的信用,我们需要使用以下 UML:
我知道该框架有一个 Sun
的实例,并且 Sun
实现了接口(interface) Orbit
中的方法,并且有一个使用 OrbitingBody
构造函数创建的 Planet
实例,等等......我不理解的是 UML 中的关系在接口(interface) 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 图的问题
Planet
的 Sun
部分或 Moon
的 Planet
部分如何?«Orbit»
和 {Orbiting Body}
的 UML 符号是错误的。我猜 Orbit
是一个接口(interface)?在这种情况下,正确的表示法是使用 Lollipop 表示法,或者在名称前使用关键字 «interface» 的标准框。至于 Orbiting Body
,大括号仅在 UML 中用于表示约束。我又在猜测你的老师打算指出一个 抽象 类?在这种情况下,正确的做法是使用斜体作为名称,因此 Orbiting BodyOrbit
是 Orbiting Body
的一部分。我可以理解 Orbiting Body
和 Orbit
之间是否存在正常关联 and 'Orbit
之间的关联方向与 Sun
和 Planet
以及 Planet
和 Moon
之间的关联方向相反。我认为实现 Orbit
和 Orbiting Body
的类之间的关联将是对该关联的某种重新定义,但在这种情况下,方向需要相同。 (并且还需要指明重新定义)。按照现在的设计,应该有两个关联,您需要实现
Sun
和 Planet
之间的关联以及 Planet
和 Moon
之间的关联。每个方向一个。我建议你忽略实际 UML 图的细节,因为它的不一致并使用你自己的判断。程序员应该不仅仅是一个在代码中翻译 UML 的无意识的代码猴子。您应该自己思考并(如果可能)挑战和/或改进分析。
您的代码中的问题:
Planet
, Moon
) 和 Orbits ( Sun
, Planet
) 之间的关系。Moon
类上有两个 Planet
类型的属性?。一个 Planet
不能有超过 2 个 Moon
吗?我期待某种 Moon
s Sun
相关的 Planet
类的相同注释。 关于java - UML 中的接口(interface)和抽象类聚合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49567460/