如何从抽象类中强制一个子类来实现静态方法



我有一个抽象类Animal,然后我有像Dog和Cat这样的类,它们扩展了Animal类。

我想确保父类Animal的所有子类都有一个静态方法:getProperties。即使其他人无法访问我的代码,也实现了一个新的Animal子类。

我希望它是静态的,因为Dog类的所有Animals都有完全相同的属性(或者你不需要Dog来知道Dog的一般外观),因此它是对classtype调用的方法,而不是类实例,这是有道理的。

这可能吗?

Java中的static表示该方法(例如)与该类的任何实例都不相关。它对所有实例都是通用的,并且它的实现只是嵌套在类中。

当我读到您的问题时,我相信您需要在Animal类中使用abstract方法。

public abstract class Animal {
    public abstract <some-return-type> getProperties();
}

在这种情况下,继承Animal的每个类都必须提供getProperties方法的实现(在这种情况中,它是而不是static)。

如果您希望它是静态的,只需使它成为静态的(在Animal类中),但您将有一个单个共享实现。

Java对象模型不支持类侧继承(不像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类提供有关它的元数据,请为它提供getPropertiesgetNumberOfLegsgetLocomotionType等实例方法。您可以使用静态常量来实现这些:

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()

相关内容

最新更新