[英]Instantiate a variable in a child class
是否可以在父類中聲明的子類中實例化變量? 會有什么好處? 前任:
public class Animal{ Food foodType;}
public class Dog extends Animal{
public Dog(){
foodType=new Food();
}
}
這樣做有很多好處。 實際上取決於您的設計。
我創造了一個例子,也許是我能做的最糟糕的例子,但我認為它會讓你澄清你的想法。 我只是試着按照你的代碼。
在這個例子中,我們使用Strategy
設計模式和Inversion of Control
。 你可以看到 Animal 對 Food 的實現一無所知? 想想看, Animal.eat()
可以在不改變eat()
方法的情況下運行多個實現。 OOP 可以做的就是一點點。
public class Main {
public static void main(String ... args){
Animal paul = new Dog("Paul");
Animal elsa = new Cat("Elsa");
paul.eat();
elsa.eat();
}
public static abstract class Animal {
private String name;
protected Food foodType;
public Animal(String name){
this.name = name;
}
public void eat() {
System.out.println("The " + name + " has eaten " + foodType.getAmount() + " " + foodType.foodName());
}
}
public static class Dog extends Animal {
public Dog(String name) {
super(name);
foodType = new DogFood();
}
}
public static class Cat extends Animal {
public Cat(String name) {
super(name);
foodType = new CatFood();
}
}
public interface Food {
int getAmount();
String foodName();
}
public static class DogFood implements Food{
@Override
public int getAmount() {
return 2;
}
@Override
public String foodName() {
return "beef";
}
}
public static class CatFood implements Food{
@Override
public int getAmount() {
return 5;
}
@Override
public String foodName() {
return "fish";
}
}
}
優勢:
例如。
如果有 DogFood 類擴展 Food,Dog 可以實例化它(如果 Dog 知道 DogFood)並且 Animal 不需要知道 DogFood。
這簡化了代碼。
由於 food 類型是一個 Animal 屬性,並且對於特定的子類始終相同,因此在 Animal 中將其final
,並通過 Animal 構造函數傳入。
public class Animal {
public final Food foodType;
public Animal(Food foodType) {
this.foodType = foodType;
}
}
public class Dog extends Animal{
public Dog() {
super(new DogFood());
}
}
現在每個 Animal(子類)都有一個 foodType,並且不必填充父類的字段。 責任就在他們應該在的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.