-3

我正在编写一个计算冰淇淋成本的简单程序。

这个过程很简单:挑一个蛋筒,挑一些口味,挑一些浇头,然后付钱。

有一堆不同的蛋筒,一堆不同的口味,还有一堆不同的配料。

我的设计是使用装饰器类来包装冰淇淋,类似于下订单的方式。

所以我有我的基本 Ice Cream 类,它提供了一个“数量”属性,指示事物的成本,以及 Cone、Flavor 和 Toppings 的装饰器类。每个班级都会拿一个冰淇淋对象并添加到数量,因此您基本上可以混合搭配不同类型的冰淇淋。

我有另一个处理实际货币交易的类,它接受各种对象并计算价格。特别是,如果它看到一个冰淇淋,它将执行一些与冰淇淋相关的过程。

现在,这个设计听起来不错,但是我如何检查从冰淇淋机中出来的物体是否是冰淇淋类型的呢?毕竟,理论上它会被一堆装饰器包裹起来,所以如果你问它的类,你可能会看到像 Topping 这样的东西,而不仅仅是冰淇淋。冰淇淋也不需要超级类;它可能是层次结构中的几个类。

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

此外,我已经使用一组类实现了它。我可以使用 ruby​​ 中的其他方法来实现这种类型的设计吗?

4

1 回答 1

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

于 2012-05-04T18:21:37.657 回答