子类需要设置父类的唯一对象字段吗?

时间:2018-08-15 00:42:09

标签: java object inheritance

我有一个父类,该父类具有一个声明的唯一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);

2 个答案:

答案 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 ...
}

您的困惑是正常的,并且与对继承的理解有关。只需记住,虽然超类类型的变量可以包含对其子类的任何实例(对象)的引用,但事实并非如此。超类“不知道它是孩子的​​存在”。

我希望我的解释很清楚,对您有帮助。再见!