繁体   English   中英

实例化子类中的变量

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM