覆盖 Java 中的 属性
Override a property in Java
在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;
}
}
然后我可以在 class A
的任何成员上调用抽象方法 getProperty()
。然而,这似乎很笨拙——似乎应该有一些方法可以简单地覆盖 属性 本身,以避免在扩展 A
的每个 class 中重复 getProperty()
方法。
像这样:
public abstract class A {
public static abstract int PROPERTY;
}
public class B extends A {
@Override
public static int PROPERTY = 5;
}
这样的事情可能吗?如果是这样,如何?否则,为什么不呢?
你不能 "override" 字段,因为只有方法可以有覆盖(并且它们不允许是静态的或私有的)。
你可以通过非抽象的方式实现你想要的效果,并为子类提供一个受保护的域来设置,像这样:
public abstract class A {
protected int propValue = 5;
public int getProperty() {
return propValue;
}
}
public class B extends A {
public B() {
propValue = 13;
}
}
这个技巧让 A
的子类 "push" 将新值放入其超类的上下文中,获得类似于 "overriding" 的效果,而无需实际覆盖。
在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;
}
}
然后我可以在 class A
的任何成员上调用抽象方法 getProperty()
。然而,这似乎很笨拙——似乎应该有一些方法可以简单地覆盖 属性 本身,以避免在扩展 A
的每个 class 中重复 getProperty()
方法。
像这样:
public abstract class A {
public static abstract int PROPERTY;
}
public class B extends A {
@Override
public static int PROPERTY = 5;
}
这样的事情可能吗?如果是这样,如何?否则,为什么不呢?
你不能 "override" 字段,因为只有方法可以有覆盖(并且它们不允许是静态的或私有的)。
你可以通过非抽象的方式实现你想要的效果,并为子类提供一个受保护的域来设置,像这样:
public abstract class A {
protected int propValue = 5;
public int getProperty() {
return propValue;
}
}
public class B extends A {
public B() {
propValue = 13;
}
}
这个技巧让 A
的子类 "push" 将新值放入其超类的上下文中,获得类似于 "overriding" 的效果,而无需实际覆盖。