[英]How do I enforce a child class from an abstract class to implement a static method
我有抽象类Animal,然后有Dog和Cat之类,其中扩展了Animal类。
我想确保父类Animal的所有子类都具有静态方法:getProperties。 即使其他人无法访问我的代码,也实现了一个新的Animal子类。
我希望它是静态的,因为所有Dog类的Animals都具有完全相同的属性(或者您不需要Dog就能知道Dog的一般外观),因此这是在类类型上调用的方法,而不是一个类实例。
这可能吗?
Java中的static
表示该方法(例如)与该类的任何实例都不相关。 它对于所有实例都是通用的,并且其实现只是嵌套在类中。
当我读到您的问题时,我相信您需要Animal
类中的abstract
方法。
public abstract class Animal {
public abstract <some-return-type> getProperties();
}
在这种情况下,每个继承Animal
类都必须提供getProperties
方法的实现(在这种情况下,该方法不是 static
)。
如果你希望它是静态的,只要不是这样(在中Animal
类),但随后你将有一个单一的和共享的实现。
不,不可能。 在静态上下文中没有继承。 不,没有方法可以强制实现静态方法的类。
Java Object模型不支持类端继承(与Smalltalk或Ruby不同)。 例如,您必须显式实现域的元模型,如下所示:
public abstract class AnimalDescriptor<T> { // or <T extends Animal>
public abstract List<String> getProperties();
public abstract T newAnimal();
}
public class DogDescriptor extends AnimalDescriptor<Dog> {
public static final DogDescriptor INSTANCE = new DogDescriptor();
public List<String> getProperties() { ... }
public Dog newAnimal() { return new Dog(); }
}
void doStuff(AnimalDescriptor<?> desc) {
desc.getProperties();
}
doStuff(DogDescriptor.INSTANCE);
这只是一个示例,您将不得不对其进行调整以适合您的需求。 例如,您可能想在动物方面添加getDescriptor()
方法。
在Java中这是不可能的,您最多可以“隐藏”静态方法,但不能“覆盖”静态方法。
如果要让每个Animal类提供有关它的元数据,请给它提供实例方法,如getProperties
, getNumberOfLegs
, getLocomotionType
等。您可以使用静态常量来实现这些方法:
public abstract class Animal {
public abstract int getNumberOfLegs();
}
public class Dog {
private static final NUMBER_OF_LEGS = 4;
public int getNumberOfLegs() {
return NUMBER_OF_LEGS;
}
// ...
}
我想您想要getProperties
方法的某种Map
。 这样做的问题是您必须非常小心,以使返回的地图不可变。 一个错误,有人可以为每个人更改静态实例。 使该方法成为实例方法几乎不会花费您什么。
静态方法需要能够运行,而无需您显式创建Animal
类的新实例。 您将必须完全实现Animal.getProperties()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.