[英]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類提供有關它的元數據,請給它提供實例方法,如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;
}
// ...
}
我想您想要getProperties
方法的某種Map
。 這樣做的問題是您必須非常小心,以使返回的地圖不可變。 一個錯誤,有人可以為每個人更改靜態實例。 使該方法成為實例方法幾乎不會花費您什么。
靜態方法需要能夠運行,而無需您顯式創建Animal
類的新實例。 您將必須完全實現Animal.getProperties()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.