基类:
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
,因为基类'}构造函数,因此animal
和dog
基本相同。有没有办法避免这种情况,或者这是实现此功能的最佳方法?
答案 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完成的。