我有一個SuperClass命名的車輛,其他領域有一個字段/方法稱爲鏈。現在我有2個子類作爲汽車和自行車。現在我們知道自行車需要鏈條,但汽車沒有。那麼在Java中,我們如何確保鏈屬性只能在Bike CLass中繼承,而不能在Car Class中繼承?現在我還有其他像Bicycle這樣的類,它也需要鏈屬性....那麼該怎麼做呢?一個子類不會繼承超類的方法,但另一個子類不會。怎麼做?
回答
那麼,我們如何確保
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");
}
}
...但它是糟糕的設計,你應該避免它,如果可能的話。
你把它分解了
Vehicle
* Other fields
MotorizedVehicle extends Vehicle
* Specialized fields
NotMotorizedVehicle extends Vehicle
* Chain
Car extends MotorizedVehicle
Bike extends NotMotorizedVehicle
我會使用ChainDriveVehicle而不是NotMotorizedVehicle。考慮一輛馬車,一隻狗拉雪橇和一輛便士自行車。 –
是的,我真的沒有太多的想法,只是想讓這個意思有點清楚。 ChainDrive肯定好多了。 –
聲明自行車,它屬於內的Chain
成員字段。你所要求的是不可能的,也不是真的有必要。
現在我還有其他類,如自行車,也需要鏈屬性....所以如何做到這一點?在那種情況下,對於需要鏈的每個類,我必須在每個類中聲明它? – Ranjan
不,請製作這些類的通用父類。該課程將成爲車輛的一個子類 –
如果您的Vehicle
類具有Chain
屬性,則所有繼承Vehicle
的類將繼承chain
屬性。沒有什麼異常,因爲這就是OOP中的繼承。您可以選擇不使用鏈接屬性Car
類和Bike
您可以使用它。
也作爲Jeroen指出你可以實現這樣的類設計,這是我通常會在這種情況下。
把chain
成員放在Vehicle
類是不好的設計,因爲不是所有的Vehicle
s有chain
。
由於code re-usability
,將成員放在不應該是的設計是不好的設計。
如果您確實需要避免代碼重複,請定義一個名爲ChainedVehicle extends Vehicle
的抽象類並將chain
成員添加到該成員中,現在您擁有鏈式車輛的正確超類。
如果您的車輛可以組織爲一個層次結構,請使用Jeroen Vannevel的答案。如果您需要更多靈活性,請考慮代表車輛功能的一組界面。
HasChain將由包括Bicycle在內的任何鏈條驅動車輛實施。
HasWheels將由MotorBike,Bicycle,Car和HorseDrawnCarriage實施,但不由DogSled實施。
機動化將由MotorBike和Car實施。
AnimalDrawn將由HorseDrawCarriage和DogSled實現。
- 1. Prototypejs子類不會繼承超類的屬性
- 2. 可以從c#中的基類繼承另一個子類的繼承方法的子類。
- 3. Perl,Moose - 子類不是繼承超類的方法
- 4. Python - 從一個類繼承一個方法,但名稱不同
- 5. 爲什麼我的子類不會繼承父類的所有方法?
- 6. ASP.NET MVC 3 ContentResult類型將不會接受類繼承另一個類
- 7. 繼承工作與一個類,但不與另一個
- 8. 爲什麼在這個例子中,子類不會繼承python中父類的方法?
- 9. 如何從另一個類(不繼承)
- 10. 超類繼承自一個子類。 Coursera。他們瘋了嗎?
- 11. 一個子類調用它的超類的方法(這也是一個子類)
- 12. 繼承不能調用子類方法
- 13. 爲什麼zope.interface.Interface的子類的子類不會繼承其父母名稱?
- 14. JavaScript繼承。從另一個類繼承的對象和方法
- 15. 抽象類繼承另一個類的方法和屬性
- 16. Java繼承的子類和超類
- 17. 子類UIView(另一個子類UIView子)的繪製方法不叫
- 18. Python多繼承 - 調用一個類的方法,但哪一個?
- 19. 不能覆蓋超類的抽象方法時,子類是在另一個包
- 20. C#:繼承一個子類,它從父
- 21. Javascript繼承:從超類的方法設置子類的屬性
- 22. 如何從另一個繼承類的繼承類的說話
- 23. Java的繼承:在超類中調用子類方法
- 24. C# - 當每個繼承類需要基類getter,但setter只適用於一個繼承類時,該怎麼辦?
- 25. 不繼承父類的子類
- 26. 繼承 - UIAlertView在超類和子類
- 27. 將一個子類傳遞給一個方法,但有超類作爲參數?
- 28. 繼承在lesscss,不繼承子類
- 29. 使繼承的方法使用子類的變量而不是超類'
- 30. 超類可以從其子類繼承方法嗎?
你不能,你的模型壞了。你爲什麼不只是在自行車裏宣佈鏈條 –
現在我還有其他類,比如自行車,它也需要鏈條屬性....那麼該怎麼做呢?在那種情況下,對於需要鏈的每個類,我必須在每個類中聲明它? – Ranjan