我有一个父类,该父类具有一个声明的唯一ModelType对象,该对象还具有子类。每个Child类都有一个唯一的模型类型,因此我希望所有子类中的引用变量“ model”都相同,因此可以引用该变量。但是,在将模型类型初始化为任何子对象之后,我的函数会引发错误,因为在这种情况下,类型不是模型类型,而是Cuboid或Pyramind(其中一个子对象)。
可能有比创建父级并将其设置为子级更好的方法。如何在父类中有一个可以设置为多种类型的引用变量?换句话说,变量“ model”必须是不同的类型。
class Parent {
ModelType model;
}
class ChildOne extends Parent {
model = new Cuboid();
void float vertices(Pyramid c){
// ... stuff ...
}
}
class ChildTwo extends Parent {
model = new Pyramid();
void float vertices(Pyramid c){
// ... stuff ...
}
}
在将另一个ChildTwo的“模型”传递给该类的位置时,使用顶点时出现错误:
The function vertices(ModelType) doesn't exist
ChildTwo a = new ChildTwo();
ChildTwo b = new ChildTwo();
a.vertices(b.model);
答案 0 :(得分:1)
Generic class在这种情况下可以与Upper Bouded WildCard一起使用,因此可以根据子类类型参数限制vertices
方法接受参数。
abstract class Parent<T extends ModelType> {
T model;
abstract float vertices(T c);
// To set the model, setter can be created in parent class.
// Or through constructor of child class.
void setModel(T modelToSet) {
this.model = modelToSet;
}
}
class ChildOne extends Parent<Cuboid> {
ChildOne(Cuboid c) {
this.model = c;
}
float vertices(Cuboid c) {
// ... stuff ...
return 0;
}
}
class ChildTwo extends Parent<Pyramid> {
ChildTwo(Pyramid p) {
this.model = p;
}
float vertices(Pyramid p) {
// ... stuff ...
return 0;
}
}
答案 1 :(得分:0)
你好!
您收到此错误是因为,当指定方法“ vertices()” 来接收对“金字塔” 类型的对象的引用作为参数时,而是将引用传递给类型为“ ModelType” 的对象。为了解决这个问题,一种选择是将“ vertices()” 方法参数更改为类型“ ModelType” 。见下面。
float vertices(ModelType c){
// ... stuff ...
}
您的困惑是正常的,并且与对继承的理解有关。只需记住,虽然超类类型的变量可以包含对其子类的任何实例(对象)的引用,但事实并非如此。超类“不知道它是孩子的存在”。
我希望我的解释很清楚,对您有帮助。再见!