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