【问题标题】:Should base class attribute controlled by Derived class应该由派生类控制基类属性
【发布时间】:2016-02-11 00:27:51
【问题描述】:

我目前正在设计一些系统,我对使用派生类控制基类属性是否正确感到困惑。

例如:

Class Building {
   String name;
   String[] facilities;
}

Class OfficeBuilding extends Building{

}

Class ResidentialBuilding extends Building {
}

//楼宇控制属性的类型,比如这里的设施,默认为空。它应该是派生类的一部分,还是应该保留基类的一部分,派生类应该只覆盖其值?

注意事项: 1)。这里所有的类都是数据类。 2)。基类设施属性始终为空并由子类控制。

谢谢。

【问题讨论】:

    标签: java oop


    【解决方案1】:

    解决方案不止一种。不知道您的用例我会说名称和设施可以由父类完全管理,甚至不能从子类直接访问(只能通过构造函数/某些方法)。我还将设施存储为列表:

    Class Building {
       private String name;
       private List<String> facilities;
    
       public Building(String name, String... facilities) { // facilities won't be null this way
           this.name = name;
           this.facilities = new ArrayList<String>(Arrays.asList(facilities));
       }
    
       public Building(String name) {
           this(name, new String[0]);
       }
    
       // Only if this makes sense
       public Building() {
           this("");
       }
    
       public String[] getFacilities() {
           return facilities.toArray(new String[facilities.size()]);
       }
    
       // if needed you can...
       public void addFacility(String facility) { ... }
       public void removeFacility(String facility) { ... }
    }
    
    Class OfficeBuilding extends Building {
        public OfficeBuilding() {
            super("Office", "facility1", "facility2");
            //...
        }
    }
    

    【讨论】:

    • 谢谢基里尔。可能我没有很好地解释我的问题。让我们认为您是这些类的客户端,并且服务器对设施值可能存在限制。现在作为客户端,如果不调用服务器,您将无法知道您在这些类中是否有错误。我在想从服务器的角度来看是正确的做法还是有更好的方法来处理它
    • @ user3089214:如果设施是一组预定义的值,那么它们不应该是一个字符串,而是用你可能需要的所有值定义一个Enum Facilities,并更改实现以使用枚举而不是一个字符串。如果您的意思是某些建筑物只允许拥有某些设施,那么您需要一些东西来规范这些规则。根据它们是什么(我仍然不清楚),它可能是基类,也可能是其他一些(独立的)类来规范它。
    • 您使用 ENUM 绝对正确,但我不想每次将新设施添加到类别时都更改代码(添加枚举),这就是我不将其设为 ENUM 而只是字符串的原因.
    • @user3089214: 好吧,如果程序的某些部分需要检查设施是否有效,您需要在某处有一个有效值列表,对吗?例如,您可以将它们存储为外部属性文件、数据库等。
    • 谢谢 Kiril,这就是我计划做的。我有点困惑,但谢谢。讨论很有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多