如何使用java严格实现给定的uml?

yx2lnoni  于 2021-06-29  发布在  Java
关注(0)|答案(2)|浏览(401)

我正在尝试使用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
活动准备就绪!!
我目前的结果是:
剧院区:[还没有价值]
活动准备就绪!!

f2uvfpb9

f2uvfpb91#

你的代码和uml是不相等的,你的uml有一些问题。在您的图中,place是一个具体的类,而在您的代码中它是一个抽象类。place类中没有理由有私有属性,因为它们不能被它的子类访问,所以它们的可见性应该被protected替换(uml中的符号是#)。building类只声明一个方法,所以它可以被一个接口(在uml中,你可以使用一个圆或使用接口原型)代替,而不需要任何place继承,这个解决方案会影响剧院,而不是成为building的子类,而是成为实现building接口的place的子类。
关于您的代码,theater类中的showarea方法不显示任何值,那么为什么期望值为6000呢?如果您希望6000值来自场所的容量,那么首先需要一个方法(可能是setter)来设置容量,在主类中使用此方法,然后使容量受保护以供剧院访问,最后在showarea方法中使用。

cidc1ykv

cidc1ykv2#

你的图表有问题吗

图表是模型的部分表示:
这个 Place 的属性 placeName , placeDescription , capacity , workingHours 都是私人的( - ). 这意味着它们不可用于 Building 也不是为了 Theater . 既然没有构造函数和setter,这些属性又有什么用处呢?既然您没有公共getter,那么这些值如何在任何应用程序中使用呢 showX() 更专业的班级运作?
Building 无法访问私有属性,也没有其他属性,怎么办 showArea() 有什么有用的吗?
最后,你说的对 Theatre . 但是,您诊断的缺失大小及其初始化问题已经适用于 Building .
因此,如果严格遵循图表,不添加其他隐式操作,就永远无法在控制台上实现预期的结果。我希望这不会让你感到震惊。这里引用了支持我的声明的uml规范:
11.4.3.1:(…)一个类不能访问另一个类的私有特性,或访问另一个非其祖先类上的受保护特性。
次要的语法问题,您可以改进:
斜体表示法是用来表示类名是抽象的。它不再是为抽象操作正式定义的,尽管许多(我这么说是因为我自己做的)仍然使用这个符号。因此,对有实现的操作使用斜体字是完全不明确的。 void 不是标准的uml类型。返回void的操作只是指示,没有返回类型。 showEventsTheater 干掉一对牙套 () .

完成你的图表

您可以添加缺少的getter和setter。您可以按照uml规范中的说明定义构造函数:
11.4.4:(…)构造函数是一个操作,它有一个所属类类型的返回结果参数,并用标准原型标记 «Create» . 作为用法依赖项的提供者的instancespecification表示构造函数操作的单个返回结果参数的默认值。
这看起来像:

«Create» Place(...) : Place

现在您有了完成图表并实现预期结果的方法。
可能需要更多的改进:
如果 Place 实现任何操作您应该使它抽象,因为它不能被示例化。
可以使用 {redefines ...} 在图表中。但这不是必须的。
考虑到 showEvents() 没有其他事情发生。。。

重新考虑你的设计

剧院是建筑吗?在我的镇上,有一座大楼,里面有一个购物中心和一个剧院。所以我的建议是更喜欢合成而不是继承。

相关问题