我正在编写一个计算冰淇淋成本的简单程序。
这个过程非常简单:选择一个圆锥,挑选一些口味,挑选一些浇头,然后支付金额。
有许多不同的锥体,一堆不同的口味,还有一堆不同的配料。
我的设计是使用装饰器类来包装冰淇淋,类似于您下订单的方式。
所以我有我的基础冰淇淋类,它提供了一个“数量”属性,表明物品的成本,以及Cone,Flavor和Toppings的装饰器类。每个班级都会拿一个冰淇淋对象加上量,所以你基本上混合搭配不同类型的冰淇淋。
我有另一个处理实际货币交易的类,它接受各种对象并计算价格。特别是,如果它看到冰淇淋,它将执行一些与冰淇淋相关的过程。
现在,这个设计听起来不错,但是如何检查冰淇淋制造商出来的物品是否是冰淇淋类型?毕竟,它理论上会被一堆装饰者包裹着,所以如果你要求它的类,你可能会看到像Topping而不仅仅是冰淇淋。超级冰淇淋也不是必需的;它可能是层次结构中的几个类。
<topping ice cream>.Instanceof(Ice_Cream)
似乎不起作用。
另外,我已经使用一组类实现了它。我可以用ruby的其他方法来实现这种类型的设计吗?
答案 0 :(得分: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 value
when String
# something
when Array
# something else
end
对于更多惯用设计方法,您可能应该研究模块及其作为mixins的用途:
http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html