簡體   English   中英

從Java中的抽象類強制實例變量實現

[英]Enforcing instance variable implementation from an abstract class in Java

我正在嘗試設計一個抽象類,該類將強制實例變量的實現,即使該實例變量在抽象級別是未知的也是如此。 例如:

public abstract class AbstractDiet{
    abstract void computeMeat()
    abstract void computeVeggies()
    …
}

public abstract class AbstractAnimal{
    protected AbstractDiet diet;
    …   
}

然后,我希望用戶實現以下內容:

public class Cat extends AbstractAnimal{
    protected CatFoodDiet diet;   // CatFoodDiet extends AbstractDiet
    …
}

這是實現diet變量的最佳方法嗎? 我想強制說AbstractDiet的子類總是在AbstractAnimal的子類中實現。

您不能(也不應該)那樣進行設計。 使用抽象類,嘗試如下操作:

public abstract class AbstractDiet {
    abstract void compute();
}
public abstract class AbstractAnimal<T extends AbstractDiet> { 
    protected T diet;
}
public class CatFoodDiet extends AbstractDiet {
    compute() {
        //
    }
}
public class Cat extends AbstractAnimal<CatFoodDiet> {
    // use field in super which is type CatFoodDiet
}

但是通常,對於抽象類型,您將使用接口而不是抽象類。

首先:將實例變量設為私有,並提供訪問器方法。

第二:聽起來好像您正在嘗試定義一個接口。 每當您想說“每只動物都有飲食”之類的內容時,都可以使用界面。

interface Animal {
    Diet getDiet();
    ...
 }

如果願意,您還可以合並Bohemian的想法,並使之通用。

interface Animal<D extends Diet> {
    D getDiet();
    ...
}

這樣,在定義不同種類的動物時,您將擁有最大的自由度

class Cat implements Animal<CatDiet> {
    CatDiet getDiet() { return...; }
}

最靈活的方法是只要求子類提供信息:

public abstract class AbstractAnimal {
    // Subclasses must provide a function that returns the diet
    public abstract AbstractDiet getDiet();
}

public class PetRock extends AbstractAnimal {
    @Override
    public AbstractDiet getDiet() {
        return new SunlightDiet();
    }
}

如果要強制執行特定的實現,這是一種常見的方法:

public abstract class AbstractAnimal {
    private AbstractDiet diet;

    // Provide a constructor that sets a diet
    protected AbstractAnimal(AbstractDiet aDiet) {
        if (null == aDiet)
            throw new NullPointerException("Diet must be specified");
        diet = aDiet;
}

public class PetRock extends AbstractAnimal {
    public PetRock() {
        // Subclasses have to provide a diet to the superclass
        super(new SunlightDiet());
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM