[英]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.