我有抽象类动物,然后我有像狗和猫这样的类,它们扩展了动物类。
我想确保父类 Animal 的所有子类都有一个静态方法:getProperties。即使其他无法访问我的代码的人实现了一个新的 Animal 子类。
我希望它是静态的,因为 Dog 类的所有 Animals 都具有完全相同的属性(或者您不需要 Dog 来知道 Dog 的一般外观),因此它是在类类型上调用的方法是有道理的,而不是一个类实例。
这可能吗?
我有抽象类动物,然后我有像狗和猫这样的类,它们扩展了动物类。
我想确保父类 Animal 的所有子类都有一个静态方法:getProperties。即使其他无法访问我的代码的人实现了一个新的 Animal 子类。
我希望它是静态的,因为 Dog 类的所有 Animals 都具有完全相同的属性(或者您不需要 Dog 来知道 Dog 的一般外观),因此它是在类类型上调用的方法是有道理的,而不是一个类实例。
这可能吗?
Java 中的Astatic
表示方法(例如)与类的任何实例都不相关。它对所有实例都是通用的,它的实现只是嵌套在类中。
当我读到你的问题时,我相信你在课堂上需要一个abstract
方法。Animal
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
类的新实例的情况下运行。您将必须完全实施Animal.getProperties()
.
如果您想让每个 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
方法。问题在于您必须非常小心地使您返回的地图不可变。一个错误,有人可以为每个人更改静态实例。使该方法成为实例方法几乎不会花费您任何费用。