抽象类变量vs子类变量,这是更好的

时间:2018-02-05 22:30:54

标签: java class variables interface abstract

背景

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 { ...};

这里假设所有动物都有房子。每只动物只会生活在其特定的房子里。我只想问一下哪个地方(抽象类或子类)更好地放置这个变量。

问题:

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

====选项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 个答案:

答案 0 :(得分:0)

这取决于您计划如何建模您的情况。以下是一些建议:

  1. 如果所有动物都有房子,那么在超类中添加House属性是有意义的。这确保了属性可用于所有子类,而不管它是哪个房子。这适用于您描述的模型。

  2. 如果只有一只特定的动物要有房子,那么按照(1)给所有动物房屋是没有意义的。然后,您必须仅向该类提供该属性,例如DogHouse中的Dog

  3. 总而言之,您的选项3将更适合。