2014-01-12 90 views
-1

我有一個SuperClass命名的車輛,其他領域有一個字段/方法稱爲鏈。現在我有2個子類作爲汽車和自行車。現在我們知道自行車需要鏈條,但汽車沒有。那麼在Java中,我們如何確保鏈屬性只能在Bike CLass中繼承,而不能在Car Class中繼承?現在我還有其他像Bicycle這樣的類,它也需要鏈屬性....那麼該怎麼做呢?一個子類不會繼承超類的方法,但另一個子類不會。怎麼做?

+0

你不能,你的模型壞了。你爲什麼不只是在自行車裏宣佈鏈條 –

+0

現在我還有其他類,比如自行車,它也需要鏈條屬性....那麼該怎麼做呢?在那種情況下,對於需要鏈的每個類,我必須在每個類中聲明它? – Ranjan

回答

1

那麼,我們如何確保Chain屬性在Bike類只繼承,但不是在Car

你不能。

每個子類都繼承其超類的所有公共字段和方法。如果沒有,那麼Java就不會正確地實現面向對象編程的核心類型/ Liskov substitution principle

正確的解決辦法是不要使Chain屬性爲Vehicle


在一種方法的情況下,Java確實爲您提供了另一種方法;例如

public class Tram extends Vehicle { 
     ... 
     public SteeringWheel getSteeringWheel() { 
      throw new UnsupportedOperationException(
        "A tram has no steering wheel"); 
     } 
    } 

...但它是糟糕的設計,你應該避免它,如果可能的話。

3

你把它分解了

Vehicle 
    * Other fields 

MotorizedVehicle extends Vehicle 
    * Specialized fields 

NotMotorizedVehicle extends Vehicle 
    * Chain 

Car extends MotorizedVehicle 

Bike extends NotMotorizedVehicle 
+0

我會使用ChainDriveVehicle而不是NotMotorizedVehicle。考慮一輛馬車,一隻狗拉雪橇和一輛便士自行車。 –

+0

是的,我真的沒有太多的想法,只是想讓這個意思有點清楚。 ChainDrive肯定好多了。 –

0

聲明自行車,它屬於內的Chain成員字段。你所要求的是不可能的,也不是真的有必要。

+0

現在我還有其他類,如自行車,也需要鏈屬性....所以如何做到這一點?在那種情況下,對於需要鏈的每個類,我必須在每個類中聲明它? – Ranjan

+0

不,請製作這些類的通用父類。該課程將成爲車輛的一個子類 –

0

如果您的Vehicle類具有Chain屬性,則所有繼承Vehicle的類將繼承chain屬性。沒有什麼異常,因爲這就是OOP中的繼承。您可以選擇不使用鏈接屬性Car類和Bike您可以使用它。

也作爲Jeroen指出你可以實現這樣的類設計,這是我通常會在這種情況下。

0

chain成員放在Vehicle類是不好的設計,因爲不是所有的Vehicle s有chain

由於code re-usability,將成員放在不應該是的設計是不好的設計。

如果您確實需要避免代碼重複,請定義一個名爲ChainedVehicle extends Vehicle的抽象類並將chain成員添加到該成員中,現在您擁有鏈式車輛的正確超類。

0

如果您的車輛可以組織爲一個層次結構,請使用Jeroen Vannevel的答案。如果您需要更多靈活性,請考慮代表車輛功能的一組界面。

HasChain將由包括Bicycle在內的任何鏈條驅動車輛實施。

HasWheels將由MotorBike,Bicycle,Car和HorseDrawnCarriage實施,但不由DogSled實施。

機動化將由MotorBike和Car實施。

AnimalDrawn將由HorseDrawCarriage和DogSled實現。

相關問題