2010-04-07 69 views
2

我正在創建一個視頻遊戲。它包含字符&項目。因爲我想要人物&項目每個都有一個名稱,我應該使用名稱字段創建另一個名爲NamedObjects的類並且具有字符&項目擴展了那個?或者那是過度的?紅寶石抽象類設計

回答

3

對於作爲name屬性這樣簡單的事情,它可能不值得寫模塊化的代碼,因爲你可能需要的唯一路線是:

attr_accessor :name 

當然,如果你預見到命名的東西會在未來共享更多的功能,您的關注是相當有效的。而不是使用繼承,最好在Ruby中使用的模塊:

module Nameable 
    attr_accessor :name 

    # To be expanded. 
end 

class Item 
    include Nameable 
end 

class Character 
    include Nameable 
end 
+0

阿門那。當你有類'A','B'和'C'時,使用mixin也可以防止很常見的情況:假設'A'和'B'具有共同的功能'F'','A'和'C'功能'F'''。隨着類繼承,你幾乎陷入了困境。 – 2010-04-07 07:33:11

+0

@MladenJablanović:繼承Eiffel能夠很好地處理這種情況,但我同意mixin通常是更好的解決方案。 – Arkku 2010-04-07 08:16:54

+0

+1。你可以用模塊中的幾個方法來擴展這個答案。 (我想不起自己的ATM ......) – 2010-10-29 19:26:17

2

如果他們分享的所有東西都是名字,那可能是矯枉過正。

2

當它們具有相同的行爲而不是相同的數據時,類應該通常共享基類。面向對象應該總是關於行爲。創建基類時,您還應該考慮/研究Liskov substitution principle

+0

如何屬性訪問器的概念(即將可能被用於實施在這種情況下'name')適合這種行爲/數據規則?順便說一句,你能澄清Liskov原理與這裏的問題的關係,我沒有看到任何? – 2010-04-07 07:28:38

0

你會不會需要遍歷一堆NamedObjects並顯示名稱?如果是這樣,你需要NamedObjects類。如果你不這樣做,你不會...

無論如何,你不能在這樣一個小問題上發生災難性的錯誤:如果你不爲該名稱做一個基類,並且以後需要它稍後會重新組織你的班級,沒什麼大不了的。如果添加基類並不需要它,這不是一個大問題,它可以安全地被忽略。

1

在java中,我會創建NamedObject接口,如你所說。但是Ruby是一種動態的鴨式語言。沒有接口。所以只需定義一個名稱屬性並在需要的地方使用它。