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