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 图存在问题
每个关联使用 聚合(关联末尾的空心菱形)。聚合表示整体部分关系。我在图中的任何关联中都看不到这一点。 Planet
是 Sun
的一部分,还是 Moon
是 Planet
的一部分?
«Orbit»
和 {Orbiting Body}
的 UML 符号是错误的。我猜 Orbit
是一个接口?在这种情况下,正确的表示法是要么使用棒棒糖表示法,要么使用名称前带有关键字 «interface» 的标准框。至于Orbiting Body
,大括号只是在UML中用来表示约束。我又猜想你的老师是想指出一个摘要class?在那种情况下,正确的方法是使用斜体作为名称,因此 Orbiting Body
'Orbiting Body' 和 'Orbit' 之间的聚合没有任何意义。正如现在所写,Orbit
是 Orbiting Body
的一部分。我能理解 Orbiting Body
和 Orbit
之间是否存在正常关联
'Orbiting Body and 'Orbit
的关联方向与Sun
和Planet
和Planet
的关联方向相反Moon
。我认为实现 Orbit
和 Orbiting Body
的 classes 之间的关联将是对该关联的某种重新定义,但在那种情况下,方向需要相同。 (并且还需要指出重新定义)。
按照现在的设计,应该有两个关联,您需要实现 Sun
和 Planet
之间以及 Planet
和 Moon
之间的关联。每个方向一个。
我建议您忽略实际 UML 图的细节,因为它不一致并使用您自己的判断。程序员不应该只是一个用代码翻译 UML 的盲目代码猴。您应该独立思考并(如果可能)挑战 and/or 改进分析。
您的代码中的问题:
- 想想如何实现Orbiting Bodies(
Planet
,Moon
)和Orbits(Sun
,Planet
)之间的关系。
- 你需要哪个方向的?
- 您是一般层面需要还是只需要具体层面
- 为什么您的
Planet
class 上有两个 Moon
类型的属性?。 Planet
不能超过 2 个 Moon
吗?我希望得到某种 Moon
s 的列表
- 您的
Sun
class 关于 Planet
的相同评论。
我被分配了一个任务,我必须在其中实现一个模拟太阳系的小程序,该太阳系有太阳和行星绕行,并且行星必须有卫星绕行。我已经成功地实现了动画,但是为了获得完整的分数,我们需要使用以下 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 图存在问题
每个关联使用 聚合(关联末尾的空心菱形)。聚合表示整体部分关系。我在图中的任何关联中都看不到这一点。
Planet
是Sun
的一部分,还是Moon
是Planet
的一部分?«Orbit»
和{Orbiting Body}
的 UML 符号是错误的。我猜Orbit
是一个接口?在这种情况下,正确的表示法是要么使用棒棒糖表示法,要么使用名称前带有关键字 «interface» 的标准框。至于Orbiting Body
,大括号只是在UML中用来表示约束。我又猜想你的老师是想指出一个摘要class?在那种情况下,正确的方法是使用斜体作为名称,因此 Orbiting Body'Orbiting Body' 和 'Orbit' 之间的聚合没有任何意义。正如现在所写,
之间是否存在正常关联Orbit
是Orbiting Body
的一部分。我能理解Orbiting Body
和Orbit
'Orbiting Body
and 'Orbit
的关联方向与Sun
和Planet
和Planet
的关联方向相反Moon
。我认为实现Orbit
和Orbiting Body
的 classes 之间的关联将是对该关联的某种重新定义,但在那种情况下,方向需要相同。 (并且还需要指出重新定义)。
按照现在的设计,应该有两个关联,您需要实现Sun
和Planet
之间以及Planet
和Moon
之间的关联。每个方向一个。
我建议您忽略实际 UML 图的细节,因为它不一致并使用您自己的判断。程序员不应该只是一个用代码翻译 UML 的盲目代码猴。您应该独立思考并(如果可能)挑战 and/or 改进分析。
您的代码中的问题:
- 想想如何实现Orbiting Bodies(
Planet
,Moon
)和Orbits(Sun
,Planet
)之间的关系。- 你需要哪个方向的?
- 您是一般层面需要还是只需要具体层面
- 为什么您的
Planet
class 上有两个Moon
类型的属性?。Planet
不能超过 2 个Moon
吗?我希望得到某种Moon
s 的列表
- 您的
Sun
class 关于Planet
的相同评论。