3

我有这个类声明

abstract class  A {
    protected static String message = "Hello";
}

我希望这个字段传播到子类,以避免protected static String message = "Whatever";在所有子类中输入(每个子类中这个静态字段的值不同)。

我知道这行不通:

class B extends A {

    static {
        message = "Blablabla";
    }
}

因为它实际上会修改A'smessage因为静态字段/方法没有被继承。我想知道是否有其他方法可以做到这一点,或者我是否必须重写每个子类的静态字段。

4

5 回答 5

5

我建议使用被每个子类覆盖的受保护方法 getMessage() 而不是静态字段。

class B extends A {
    @Override
    protected String getMessage() {
        return "Blablabla";
    }
}
于 2012-08-27T10:54:38.887 回答
1

在这种情况下,我通常会创建一个 get 方法:

abstract class  A {
    private static final String DEFAULT_MESSAGE = "Hello";
    protected String getMessage() {
        return DEFAULT_MESSAGE;
    }
}

这使得在我想要的子类中覆盖消息变得很容易。

于 2012-08-27T10:52:48.370 回答
1

没有直接的方法可以做到这一点。

您可以考虑使用一些将 Class 对象映射到消息的实用程序类。这将帮助您使用通用方法处理基于this.getClass().

于 2012-08-27T11:40:29.583 回答
0

静态字段和方法继承的——作为 C 程序员,我被告知将它们视为类似于“全局”变量,命名为类(并具有私有/受保护的限制)。

从您的第一个片段中,B.message将是“Hello”。

你必须做到

public class A {
  protected String message = "Hello";
}

或者

public class A {
  private static String message = "Hello";
}

public class B {
  private static String message = "Howdy";
}
于 2012-08-27T10:56:25.840 回答
0

一个方面会让你实现你想做的事情吗?您可以从一个地方逐个类地配置/管理具有特定名称的方法的返回值。...这仍然比在每个子类中复制相同的样板“私有静态 ...”要多。

于 2012-08-27T22:55:15.430 回答