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

时间:2014-01-12 02:47:20

标签: java oop inheritance subclass superclass

我有一个SuperClass命名工具,其中包含一个名为Chain的字段/方法。现在我有2个Subclasses作为Car和Bike。现在我们知道自行车需要连锁店,但汽车却没有。那么在Java中,我们确保Chain属性只在Bike CLass中继承,而不是在Car Class中继承?现在我还有像Bicycle这样的其他类,它们也需要Chain属性....那么怎么做呢?

6 个答案:

答案 0 :(得分:3)

你把它分开了

Vehicle
  * Other fields

MotorizedVehicle extends Vehicle
  * Specialized fields

NotMotorizedVehicle extends Vehicle
  * Chain

Car extends MotorizedVehicle

Bike extends NotMotorizedVehicle

答案 1 :(得分:1)

  

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

中继承

你不能。

每个子类都继承其超类的所有公共字段和方法。如果它没有,那么Java将无法正确实现子类型/ Liskov substitution principle,这是面向对象编程的核心。

正确的解决方案是不要使Chain的{​​{1}}属性。


对于方法,Java确实为您提供了另一种选择; e.g。

Vehicle

......但设计很差,如果可能的话你应该避免使用它。

答案 2 :(得分:0)

在Bike中声明Chain成员字段,它属于它。你要求的是不可能的,也不是真的有必要。

答案 3 :(得分:0)

如果您的Vehicle类具有Chain属性,那么扩展Vehicle的所有类都将继承chain属性。这没有例外,因为这就是OOP中的继承。您可以选择不在Car课程中使用连锁属性,也可以在Bike中使用它。

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

答案 4 :(得分:0)

chain成员放入Vehicle课程是不好的设计,因为并非所有Vehicle都有chain

由于code re-usability而将成员放在他们不应该的地方是不好的设计。

如果你真的需要避免代码重复,那么定义一个名为ChainedVehicle extends Vehicle的抽象类并添加chain成员,现在你有了一个适用于链式车辆的超类。

答案 5 :(得分:0)

如果您的车辆可以按层次结构组织,请使用Jeroen Vannevel的答案。如果您需要更多灵活性,请考虑一组代表车辆功能的接口。

HasChain将由任何链传动车辆实施,包括自行车。

HasWheels将由MotorBike,Bicycle,Car和HorseDrawnCarriage实施,但不是由DogSled实施。

Motorized将由MotorBike和Car实施。

AnimalDrawn将由HorseDrawCarriage和DogSled实现。