如何使用Java严格实现给定的UML?

如何使用Java严格实现给定的UML?,java,inheritance,uml,abstract-class,Java,Inheritance,Uml,Abstract Class,我正在尝试使用Java实现以下UML: 我已成功执行了所有指令,但以下指令除外: 剧院级别: 覆盖showArea方法并将大小乘以12显示 我是UML新手,根据我的理解,我不允许在任何类中创建构造函数。这令人困惑,因为我不知道在哪里可以定义showArea的大小 下面是我现在的工作代码 地方班 public abstract class Place { private String placeName; private int capacity; private S

我正在尝试使用Java实现以下UML:

我已成功执行了所有指令,但以下指令除外:

剧院级别:

  • 覆盖showArea方法并将大小乘以12显示
我是UML新手,根据我的理解,我不允许在任何类中创建构造函数。这令人困惑,因为我不知道在哪里可以定义showArea的大小

下面是我现在的工作代码

地方班

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();
    }
}
建筑类

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();
    }
}
戏剧班

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();
    }
}
主类

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

活动已准备就绪,可以主持

我目前的结果:

剧院区:[还没有价值]


活动已准备就绪,可以主持

您的代码和UML不相等,您的UML存在一些问题。在您的图中,Place是一个具体的类,而您的代码将其视为一个抽象类。Place类中没有理由有私有属性,因为它的子类无法访问它们,所以它们的可见性应该被protected(UML中的符号是#)替换。building类只声明一个方法,因此它可以被一个接口(在UML中,你可以使用一个圆圈或使用接口原型)替换,而不需要任何位置继承,这个解决方案将影响剧院,而不是作为building的子代,将成为实现建筑界面的场所的子对象

关于您的代码,Theater类中的showArea方法不显示任何值,那么您为什么期望6000值呢?如果您希望6000值来自场所的容量,首先需要一个方法(可能是setter)来设置容量,在主类中使用此方法,然后使容量受保护以供剧院访问,最后在showArea方法中使用它。

图表的问题 您的图表是模型的部分表示:

  • Place
    的属性
    placeName
    placeDescription
    容量
    工作时间
    都是私有的(
    -
    )。这意味着它们既不能用于
    建筑
    也不能用于
    剧院
    。既然您没有构造函数和setter,这些属性怎么会有任何用处呢?既然您没有公共getter,那么这些值如何在更专业的类的任何
    showXxxx()
    操作中使用呢

  • 既然
    Building
    无法访问私有属性,也没有其他属性,那么
    showArea()
    如何提供有用的东西呢

  • 最后,您在
    剧院
    中的覆盖是正确的。但是,对于
    建筑
    ,您诊断的缺失尺寸及其初始化问题已经存在

因此,如果严格遵循图表,不添加其他隐式操作,就永远无法在控制台上实现预期结果。我希望这不会让你感到震惊。下面是支持我的陈述的UML规范引用:

11.4.3.1:(…)一个类不能访问另一个类的私有功能,或访问另一个非其祖先类上的受保护功能

次要的语法问题,您可以改进:

  • 斜体符号是用于类名来记录它们是抽象的。它不再是抽象操作的正式定义,尽管许多(我这样说是因为我自己做的)仍然使用这种符号。因此,对具有实现的操作使用斜体是完全不明确的

  • void
    不是标准的UML类型。返回void的操作只是指示,没有返回类型

  • showEvents
    剧院中
    为一对大括号
    ()

完成你的图表 您可以添加缺少的getter和setter。您可以按照UML规范中的说明定义构造函数:

11.4.4:(…)构造函数是具有所属类类型的单个返回结果参数的操作,并用标准原型
«Create»
标记。使用依赖项的提供者InstanceSpecification表示构造函数操作的单个返回结果参数的默认值

这看起来像:

«Create» Place(...) : Place
您现在有了完成图表并实现预期结果的方法

可能需要更多的改进:

  • 如果
    Place
    未实现任何操作,则应将其抽象化,因为它无法实例化
  • 您可以使用图表中的
    {reignes…}
    显式地执行重写。但这是没有必要的
  • 考虑到
    showEvents()
    ,并且看不到任何其他事件,我猜想缺少与事件类或接口的关系
重新考虑你的设计
剧院是建筑物吗?在我的镇上,有一座大楼,里面有一个购物中心和一个剧院。因此,我的建议是。

免责声明:UML是作为练习提供给我的,因此我无法控制它是如何制作的。关于Place类是抽象的,如果仔细观察,ShowEvents()需要是一个抽象方法,因此我选择将Place也作为一个抽象类。关于期望值,如我所说,问题和UML,如果你再次阅读我的问题,我已经说明了我尚未实现的指令,这可能导致运行代码后得到6000的值。你混合了抽象类和抽象操作。没有一个类被定义为抽象的。为什么在UML图中,所有的成员都是用斜体写的?图表上没有写Plac