2012-05-04 46 views
-3

我正在寫一個簡單的程序,計算冰淇淋的成本。紅寶石:與裝飾冰淇淋

這個過程非常簡單:選擇一個圓錐體,選擇一些口味,挑選一些配料,然後支付金額。

有一堆不同的錐體,一堆不同的風味,和一堆不同的澆頭。

我的設計是使用裝飾類來包裝冰淇淋,類似於您下訂單的方式。

因此,我有我的基礎冰淇淋類,它提供了一個「數量」屬性,表明該物品的價格以及錐體,味道和澆頭的裝飾類。每個班級將採取冰淇淋對象,並增加數量,所以你基本上混合和匹配不同類型的冰淇淋。

我有另一個類來處理實際的金錢交易,它會採取各種對象並計算價格。特別是,如果它看到冰淇淋,它會執行一些冰淇淋相關的過程。

現在,這個設計聽起來很好,但是我怎麼檢查從冰淇淋機出來的物體是冰淇淋類型呢?畢竟,它理論上會被一堆裝飾者包裹起來,所以如果你問它的課程,你可能會看到像Topping這樣的東西,而不僅僅是冰淇淋。冰淇淋也不是必需的超級類;它可能是層次結構中的幾個類。

<topping ice cream>.Instanceof(Ice_Cream)似乎不起作用。

此外,我已經使用一組類實現它。在我能用來實現這種類型的設計的紅寶石中還有其他方法嗎?

回答

1

你應該向我們展示了一些代碼,但Ruby有Object#is_a?Class#===這可以幫助在這裏:

class MyString < String ; end 
MyString.new.is_a? String #=> true 
String === MyString.new #=> true 
class AnotherString < MyString ; end 
AnotherString.new.is_a? String #=> true 
String === AnotherString.new #=> true 

如果你想知道Class#===,它主要用在case語句:

case value 
when String 
    # something 
when Array 
    # something else 
end 

對於更多的慣用設計方法,您可能應該查看模塊及其作爲mixin的使用:

http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html