2

我有抽象类动物,然后我有像狗和猫这样的类,它们扩展了动物类。

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

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

这可能吗?

4

6 回答 6

2

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

当我读到你的问题时,我相信你在课堂上需要一个abstract方法。Animal

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

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

如果您希望它是静态的,只需使其(在Animal类内),但随后您将拥有一个单一共享的实现。

于 2013-08-01T12:27:21.187 回答
1

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()在动物方面添加一个方法。

于 2013-08-01T12:51:32.700 回答
1

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

于 2013-08-01T12:27:20.843 回答
0

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

于 2013-08-01T12:26:56.860 回答
0

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

于 2013-08-01T13:20:23.457 回答
0

如果您想让每个 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;
    }
    // ...
}

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

于 2013-08-01T12:39:11.870 回答