簡體   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