abstract class 变量 vs subclass 变量,哪个更好

Abstract class variable vs subclass variable, which is better

背景:

Abstract class Animal {

  void sleep () { //implementation details.... }

  abstract void bark();
};

Class Dog extends Animal {};
Class Cat extends Animal {};

Interface House {...};
Class DogHouse implements House { ...};
Class CatHouse implements House { ...};

这里假设所有的动物都有房子。每只动物只会住在它特定的房子里。我只想问一下这个变量放在哪个地方(abstractclass还是subclass)比较好

问题:

如果我想为 Dog 添加一个 DogHouse 变量,以下哪个选项最好 class?

====选项 1 ====

public Class Dog extends Animal {
    DogHouse dogHouse = new DogHouse();
    ...
}

====选项 2 ====

public Class Dog extends Animal{
    House house = new DogHouse();
    ....
}

====选项 3 ====

Abstract class Animal {
    House House;

    void sleep () {... }

    abstract void bark();
}


public Class Dog extends Animal{
   Dog() {
     house = new DogHouse();
   }
}

这取决于您打算如何模拟您的情况。这里有一些建议:

  1. 如果所有的动物都要有房子,那么给superclass添加一个House属性是有意义的。这确保该属性可用于所有 subclasses,无论它是哪个房子。这适用于您描述的模型。

  2. 如果只有一种特定的动物要有房子,那么像 (1) 中那样给所有动物房子是没有意义的。那么您必须只向 class 提供该属性,例如 class Dog 中的 DogHouse

总之,您的选项 3 更适合。