繁体   English   中英

如何从抽象类强制实施子类以实现静态方法

[英]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类提供有关它的元数据,请给它提供实例方法,如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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM