继承避免重复的成员变量

时间:2014-04-14 19:50:47

标签: java class object inheritance parent-child

基类:

public class BaseClass {
    private Animal animal;

    public BaseClass(Animal animal) {
        this.animal = animal;
        // more code
    }

    public Animal getAnimal() {
        return this.animal;
    }

}

儿童班:

public class ChildClass extends BaseClass {
    private Dog dog;

    public BaseClass(Dog dog) {
        super(dog);
        this.dog = dog;
    }

    @Override
    public Dog getAnimal() {
        return this.dog;
    }

}

Dog extends Animal

在这种情况下,super(dog);会将dog分配给animal,因为基类'}构造函数,因此animaldog基本相同。有没有办法避免这种情况,或者这是实现此功能的最佳方法?

3 个答案:

答案 0 :(得分:4)

这是仿制药发明的那种东西。这些方面的东西可行:

public class BaseClass<TAnimal extends Animal>
{
    private TAnimal animal;

    public BaseClass(TAnimal animal)
    {
        this.animal = animal;
    }

    public TAnimal getAnimal()
    {
        return animal;
    }
}

此时,只需使用BaseClass<Dog>即可满足上述代码的要求。但你仍然可以拥有子类:

public class ChildClass extends BaseClass<Dog>
{
    public ChildClass(Dog dog)
    {
        super(dog);
    }
}

答案 1 :(得分:0)

因为Dog extends Animal您可以将Dog分配给animal变量:

public class ChildClass extends BaseClass {    

    public BaseClass(Dog dog) {
        super(dog);        
    }

    @Override
    public Dog getAnimal() {
        return (Dog) this.animal;
    }

}

ChildClass的功能可确保只能分配Dog并再次返回Dog

正如你所说super(dog);狗分配给动物,但狗是动物所以没有问题。

答案 2 :(得分:0)

您不需要ChildClass中的BaseClass构造函数。你的ChildClass应该依赖BaseClass来做扩展它的所有类共有的东西,并且只有代码才能在BaseClass中完成。

例如:

public class ChildClass extends BaseClass
{
   public ChildClass(Dog dog)
   {
      super(dog);
   }

}

你不需要覆盖getAnimal来返回Dog,在ChildClass上调用getAnimal()将调用BaseClass中的getAnimal(),它将返回BaseClass构造函数中的动物集 - 这是dog。试试看。实际上,不需要这门课程。它所做的一切都是由BaseClass完成的。