Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个子类不继承超类的方法,但另一个子类继承。怎么做?_Java_Oop_Inheritance_Subclass_Superclass - Fatal编程技术网

Java 一个子类不继承超类的方法,但另一个子类继承。怎么做?

Java 一个子类不继承超类的方法,但另一个子类继承。怎么做?,java,oop,inheritance,subclass,superclass,Java,Oop,Inheritance,Subclass,Superclass,我有一个名为Vehicle的超类,在其他字段中有一个名为Chain的字段/方法。现在我有两个子类,汽车和自行车。现在我们知道自行车需要链条,但汽车不需要。那么在Java中,我们如何确保Chain属性只在Bike类中继承,而不在Car类中继承呢??现在我还有其他类,比如Bicycle,它也需要Chain属性。。。。那么怎么做呢 那么,我们如何确保Chain属性只在Bike类中继承,而不在Car类中继承呢 你不能 每个子类都继承其超类的所有公共字段和方法。如果不这样做,Java将无法正确地实现子类型

我有一个名为Vehicle的超类,在其他字段中有一个名为Chain的字段/方法。现在我有两个子类,汽车和自行车。现在我们知道自行车需要链条,但汽车不需要。那么在Java中,我们如何确保Chain属性只在Bike类中继承,而不在Car类中继承呢??现在我还有其他类,比如Bicycle,它也需要Chain属性。。。。那么怎么做呢

那么,我们如何确保Chain属性只在Bike类中继承,而不在Car类中继承呢

你不能

每个子类都继承其超类的所有公共字段和方法。如果不这样做,Java将无法正确地实现子类型化/子类型化,而子类型化/子类型化是面向对象编程的核心

正确的解决方案是不使车辆的链属性

就方法而言,Java确实为您提供了另一种选择;e、 g

  public class Tram extends Vehicle {
      ...
      public SteeringWheel getSteeringWheel() {
          throw new UnsupportedOperationException(
                  "A tram has no steering wheel");
      }
  }
。。。但这是一个糟糕的设计,如果可能的话,你应该避免它。

你把它拆分了

Vehicle
  * Other fields

MotorizedVehicle extends Vehicle
  * Specialized fields

NotMotorizedVehicle extends Vehicle
  * Chain

Car extends MotorizedVehicle

Bike extends NotMotorizedVehicle
声明自行车内部的链成员字段,它所属的位置。您所要求的是不可能的,也不是必须的。

如果您的车辆类具有Chain属性,则扩展车辆的所有类都将继承Chain属性。这一点也不例外,因为这就是OOP中的继承。您可以选择不在Car类和Bike中使用链属性

正如前面所指出的,您也可以实现这样的类设计,在这种情况下,我通常会这样做。

将链式构件放在车辆类中是不好的设计,因为并非所有车辆都有链式构件

由于代码的可重用性,将构件放置在不应放置的位置是一种糟糕的设计


如果您确实需要避免代码重复,请定义一个名为ChainedVehicle Extendes Vehicle的抽象类并向其添加链成员,现在您就有了一个适用于链式车辆的适当超类。

如果您的车辆可以组织为层次结构,请使用Jeroen Vannevel的答案。如果你需要更多的灵活性,考虑一组代表车辆特征的接口。 HASCAIN将由任何链条驱动车辆(包括自行车)实施

HasWheels可以由摩托车、自行车、汽车和马车来实现,但不能由狗拉雪橇来实现

机动化将由摩托车和汽车来实现


AnimalDrawn将由马车和狗拉雪橇实现。

你不能,你的模型坏了。为什么不在BikeNow中声明Chain呢?我还有其他类,比如Bicycle,它也需要Chain属性。。。。那么怎么做呢?在这种情况下,对于每个需要Chain的类,我必须在每个类中声明它?????现在我还有其他类,比如Bicycle,它也需要Chain属性。。。。那么怎么做呢?在这种情况下,对于每个需要链的类,我必须在每个类中声明它?????不,为这些类创建一个公共父类。该类将是车辆的一个子类。我将使用链式驱动车辆,而不是非机动车辆。考虑一辆马车,一辆雪橇和一辆便士自行车。是的,我并没有太多的想法,只是想把意思说清楚一些。ChainDrive肯定要好得多。