【问题标题】:How to store subclass-specific information?如何存储子类特定的信息?
【发布时间】:2016-06-28 07:18:31
【问题描述】:

我有一个abstract class A,我希望它强制其子类具有String TitleString Description 属性。因此,如果B extends A,则 B 的属性 Title 保证在 B 的所有实例中都具有相同的值。

如果 Java 允许静态抽象方法(即,必须在每个子类中的静态方法),我会写

public abstract class A {
    public static abstract String getTitle();
    public static abstract String getDescription();
}

到目前为止,我想出的最佳想法是使用单独的枚举来存储每个子类的 Title 和 Description。这样我就可以通过一个循环查看所有Titles,并用我需要的标题实例化一个子类(这是所需的行为)。不幸的是,这样我每次添加子类时都必须更改枚举。有没有更好的办法?

【问题讨论】:

    标签: java inheritance


    【解决方案1】:

    忘记混合静态的东西和继承。只是自找麻烦。

    相反,你转向OCP

    abstract class A { 
       public final String getTitle () { return getTitleInternal(); }
       abstract String getTitleInternal();
    
    class B extends A {
       @Override
       String getTitleInternal { maybe return some static value of B }
    

    请注意,这比将受保护的字段放在类 A 上“更好”。OO 和继承的本质是关于行为(所以,你说你想要某些方法是正确的子类)。

    编辑:再次阅读您的 cmets 后;我很想在

    上提醒你

    a) 使用接口

    b) 专注于组合而不是继承

    【讨论】:

    • 谢谢。但是如果我不想在知道它的标题之前实例化一个类怎么办?我应该重新考虑我的设计吗?我坚持的问题是我让用户选择一个子类。现在我怀疑这不是一个好的决定。
    【解决方案2】:

    您是否考虑过使用受保护的字段?

    public abstract class A {
        protected String title;
        protected String description;
    }
    

    这样这两个字段在任何扩展 A 的类中都是可见的。

    public abstract class B extends A {
            public B(){
                title = ...
                description = ....
            }
    
        }
    

    【讨论】:

    • 我做到了,它们不适合的原因有两个:(1) 标题和描述必须可供外界访问(事实上,这是我试图强制执行的)和( 2) 最好确保 title 和 description 的值在同一子类的多个实例之间没有差异。
    • title 和 description 可以在抽象类中具有 getter/setter 方法,因此它们是“可访问的”。关于多个实例,我也会使用单例。但在这种情况下,我认为@Jägermeister 的回答更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    相关资源
    最近更新 更多