在Java中,我最近有几个项目,我使用了这样的设计模式:
public abstract class A {
public abstract int getProperty();
}
public class B extends A {
private static final int PROPERTY = 5;
@Override
public int getProperty() {
return PROPERTY;
}
}
然后我可以在类getProperty()
的任何成员上调用抽象方法A
。但是,这似乎很笨拙 - 似乎应该有一些方法来简单地覆盖属性本身,以避免在扩展getProperty()
的每个类中重复A
方法。
这样的事情:
public abstract class A {
public static abstract int PROPERTY;
}
public class B extends A {
@Override
public static int PROPERTY = 5;
}
这样的事情可能吗?如果是这样,怎么样?否则,为什么不呢?
答案 0 :(得分:5)
你不能"覆盖"字段,因为只有方法可以有覆盖(并且它们不允许为静态或私有)。
您可以通过使方法非抽象,并为子类提供受保护的字段来实现您想要的效果,如下所示:
public abstract class A {
protected int propValue = 5;
public int getProperty() {
return propValue;
}
}
public class B extends A {
public B() {
propValue = 13;
}
}
这个技巧可以让A
的子类"推送"一个新的值进入他们的超类的上下文,得到的效果类似于"覆盖"没有实际覆盖。