我正在尝试使用java实现以下uml:
我已经成功地执行了所有指令,但以下指令除外:
戏剧课:
重写showarea方法并以12的倍数显示大小。
我对uml是新手,根据我的理解,我不允许在任何类中创建构造函数。这让人困惑,因为我不知道在哪里可以定义展区的大小。
下面是我现在的工作代码。
place类
public abstract class Place {
private String placeName;
private int capacity;
private String placeDescription;
private int workingHours;
public abstract void showEvents();
}
建筑类
public abstract class Building extends Place{
public abstract void showArea();
}
戏剧课
public class Theater extends Building{
@Override
public void showArea() {
System.out.println("Theater area : " );
}
@Override
public void showEvents() {
System.out.println("Events ready to be hosted !!");
}
}
主要类别
public class CodingtonDemo {
public static void main(String[] args) {
Theater theater = new Theater();
theater.showArea();
theater.showEvents();
}
}
控制台中的预期结果:
剧院面积:6000
活动准备就绪!!
我目前的结果是:
剧院区:[还没有价值]
活动准备就绪!!
2条答案
按热度按时间f2uvfpb91#
你的代码和uml是不相等的,你的uml有一些问题。在您的图中,place是一个具体的类,而在您的代码中它是一个抽象类。place类中没有理由有私有属性,因为它们不能被它的子类访问,所以它们的可见性应该被protected替换(uml中的符号是#)。building类只声明一个方法,所以它可以被一个接口(在uml中,你可以使用一个圆或使用接口原型)代替,而不需要任何place继承,这个解决方案会影响剧院,而不是成为building的子类,而是成为实现building接口的place的子类。
关于您的代码,theater类中的showarea方法不显示任何值,那么为什么期望值为6000呢?如果您希望6000值来自场所的容量,那么首先需要一个方法(可能是setter)来设置容量,在主类中使用此方法,然后使容量受保护以供剧院访问,最后在showarea方法中使用。
cidc1ykv2#
你的图表有问题吗
图表是模型的部分表示:
这个
Place
的属性placeName
,placeDescription
,capacity
,workingHours
都是私人的(-
). 这意味着它们不可用于Building
也不是为了Theater
. 既然没有构造函数和setter,这些属性又有什么用处呢?既然您没有公共getter,那么这些值如何在任何应用程序中使用呢showX()
更专业的班级运作?自
Building
无法访问私有属性,也没有其他属性,怎么办showArea()
有什么有用的吗?最后,你说的对
Theatre
. 但是,您诊断的缺失大小及其初始化问题已经适用于Building
.因此,如果严格遵循图表,不添加其他隐式操作,就永远无法在控制台上实现预期的结果。我希望这不会让你感到震惊。这里引用了支持我的声明的uml规范:
11.4.3.1:(…)一个类不能访问另一个类的私有特性,或访问另一个非其祖先类上的受保护特性。
次要的语法问题,您可以改进:
斜体表示法是用来表示类名是抽象的。它不再是为抽象操作正式定义的,尽管许多(我这么说是因为我自己做的)仍然使用这个符号。因此,对有实现的操作使用斜体字是完全不明确的。
void
不是标准的uml类型。返回void的操作只是指示,没有返回类型。showEvents
在Theater
干掉一对牙套()
.完成你的图表
您可以添加缺少的getter和setter。您可以按照uml规范中的说明定义构造函数:
11.4.4:(…)构造函数是一个操作,它有一个所属类类型的返回结果参数,并用标准原型标记
«Create»
. 作为用法依赖项的提供者的instancespecification表示构造函数操作的单个返回结果参数的默认值。这看起来像:
现在您有了完成图表并实现预期结果的方法。
可能需要更多的改进:
如果
Place
实现任何操作您应该使它抽象,因为它不能被示例化。可以使用
{redefines ...}
在图表中。但这不是必须的。考虑到
showEvents()
没有其他事情发生。。。重新考虑你的设计
剧院是建筑吗?在我的镇上,有一座大楼,里面有一个购物中心和一个剧院。所以我的建议是更喜欢合成而不是继承。