我在使用Pharo設計面向對象應用程序時有點尷尬。遺傳方法調用設計問題
我有一個類Household
,這個類有一個名爲tvConnection
的屬性。此對象是Digital
或Analog
的實例。這兩個類都繼承了超級名字TVSubscription
。
如果我想在一個電視添加到我的模擬有線電視訂閱我可以簡單地調用addTV: aTelevision
我tvConnection
屬性,然後將正確地調用該方法addTV:
我在Analog
類中實現。
數字連接不能連接電視機。這些必須是SetTopBox
設備,而這些設備又可以將電視機連接到它們。
現在,我不得不拋出一個錯誤/顯示一些輸出,以防用戶試圖將電視添加到有數字連接的家庭。
我想我可以做兩兩件事:
1) 我可以實現addTV:方法在Digital
類,它只會執行什麼操作(例如顯示一個消息:「你不能這樣做!「)。但是這在很多方面似乎都是錯誤的......
2) 我可以不執行該方法並捕獲引發的MessageNotUnderstood
錯誤。 當我做了以下這會發生:
**Adding a TV**
--> call `addTelevision` in `Household`
----> this `addTV:` on the `tvConnection` property
----> catch error if any, which implies that a TV was being added to a digital connection
這兩種解決方案看起來非常髒了我。
我想我會採用這種方法。這看起來很簡單。我對這種可擴展性的唯一問題。我必須實現一個'Analog >> addSetTopBox'方法(顯示消息「不能將settopbox添加到模擬連接」)。假設我實現了另一種連接類型,例如'Sattelite',它允許具有1或0個TV對象的'SatSetTopBox'設備。這意味着我將不得不爲所有對象實現一個'addSatSetTopBox'方法。這對我來說似乎是錯誤的? –
爲什麼你需要區分這麼多?製作一個方法'addAdapter:'。然後讓班級決定他們是否可以使用這些適配器。你也可以更少限制。 E.I.允許連接任何適配器。但是當一個適配器不能理解其他適配器的消息時,事情就會崩潰。我認爲把事情放在更高層次的抽象上是很好的。所以你可以有適配器。然後每個訂閱應該知道它可以使用哪些適配器以及如何與它們交談 – Uko