Inheritance 引用子类实例变量

Inheritance 引用子类实例变量,inheritance,Inheritance,在上面的例子中,我想引用车辆中汽车的numWheels。这是怎么可能的?这是不可能的,您只能使用“super”关键字从子类引用super类的变量,反之亦然。超级类从不知道它的子类的任何信息。这是不可能的。基类永远不知道子类内部是什么,主要是因为它不知道在哪里继承了它。 这是因为继承的工作方式也是如此。子类应该添加或修改基类的行为,基类应该包含所需的基本行为和属性 编辑:添加内容以澄清OP的评论 如果希望基类有一个轮子数的方法,那么很可能需要知道成员属性或名为NumberOfWheels的变量的存

在上面的例子中,我想引用车辆中汽车的numWheels。这是怎么可能的?

这是不可能的,您只能使用“super”关键字从子类引用super类的变量,反之亦然。超级类从不知道它的子类的任何信息。

这是不可能的。基类永远不知道子类内部是什么,主要是因为它不知道在哪里继承了它。 这是因为继承的工作方式也是如此。子类应该添加或修改基类的行为,基类应该包含所需的基本行为和属性

编辑:添加内容以澄清OP的评论

如果希望基类有一个轮子数的方法,那么很可能需要知道成员属性或名为NumberOfWheels的变量的存在。在这种情况下,您需要在基本车辆类中声明这一点。您将无法在派生类中声明此变量并在基类中使用它

我可以看到你有两个选择

  • 在基类中,使GetNumberOfWheels方法抽象或虚拟,并强制派生类使用它。在这种情况下,您的dervied类可能有也可能没有变量,但将被迫实现此方法。例如,派生类中的一个可以是气垫船,它没有多个轮子变量。GetNumberOfWheels方法可以根据实现需要返回0或引发异常
  • 我更喜欢这样做,因为这是一种更干净的方式。您可以有一个具有number of wheels属性和GetNumberOfWheels方法的接口。强制您的子类实现这一点。然后,每个派生类都可以提供自己的属性和方法实现,您可以根据需要使用它

  • 好的,谢谢,很公平。但是假设我想强制在Car子类中声明numWheels。我可以使用:abstract int getNumWheels();例如,在Vehicle类中,强制在Car中实现getNumWheels()方法。强制声明变量是否有一个等价的方法?我不知道基类中还有哪些需要继承的需求,但这里似乎没有什么不一致之处。我将编辑上面的答案以提供更多细节。
    public abstract class Vehicle {
    
           public void drive(){
              spinTheWheels(subclass.getNumWheels());
           }
    
           public void spinTheWheels(int wheelsTotal){
              ....
           }
    }
    
    public class Car extends Vehicle {
         private final int numWheels = 4;
    
        ...
    }