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

时间:2013-08-01 12:25:03

标签: java

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

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

我希望它是静态的,因为所有类型Dog的动物都具有完全相同的属性(或者你不需要Dog来了解Dog的外观如何通用),因此它是有意义的,它是一个被调用的方法classtype,而不是类实例。

这可能吗?

6 个答案:

答案 0 :(得分:2)

Java中的static意味着该方法(例如)与该类的任何实例无关。这对所有实例都很常见,它的实现只是嵌套在类中。

当我读到您的问题时,我认为您需要在abstract课程中使用Animal方法。

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

在这种情况下,每个继承Animal的类都必须提供getProperties方法的实现(在这种情况下 static

如果您希望它是静态的,只需这样做(在Animal类中),但是您将拥有单个共享实现

答案 1 :(得分:1)

不,不可能。静态上下文中没有继承。不,没有办法强制实现一个类来实现静态方法。

答案 2 :(得分:1)

Java Object model不支持类端继承(与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()方法。

答案 3 :(得分:0)

在Java中这是不可能的,你可以“隐藏”一个静态方法,但不能“覆盖”它。

答案 4 :(得分:0)

如果您希望让每个Animal类提供有关它的元数据,请为其提供实例方法,如getPropertiesgetNumberOfLegsgetLocomotionType等。您可以使用静态常量实现这些:< / p>

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;
    }
    // ...
}

我想你想要Map方法的某种getProperties。问题在于你必须非常小心地使你返回的地图不可变。一个错误,有人可以为每个人更改静态实例。使该方法成为实例方法几乎不需要任何费用。

答案 5 :(得分:0)

静态方法需要能够在没有显式创建Animal类的新实例的情况下运行。您必须全面实施Animal.getProperties()