簡體   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