使用多态继承定义对象的行为

时间:2010-10-14 22:08:23

标签: ruby-on-rails inheritance polymorphic-associations

今天,我面临着为购物车模型创建不同行为的挑战。这是因为网上购物的主人想要创建一些促销活动,如买1,获得5或获得25%的折扣+一些额外的东西等等。

我想过用多态继承来做这件事,我的购物车模型只会保留购买的产品和配件,并且会有许多“行为模型”,它会获得数据,例如购买的总数(可能会得到25) %off)并调用关闭交易的方法(我可以为促销活动添加新的,指定的产品,你可以获得5件免费的东西)。

一开始我似乎可以创建这种关系,因为它不需要在模型界面上做太多工作,因为它会继续与其他对象正常通信,只是内部会被更改。现在我看到自己在行为模型上创建了大量废话,重复代码,并开始计算是否还有其他更优雅的方法来做这个......

你知道更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我用一点元编程解决了这个问题!现在我的购物车模型就像这样:

  def after_initialize

    extend BoxStandardMethods

    if self.box_behavior_type?
      extend Object.const_get(box_behavior_type)
    end
  end

其中BoxStandardMethods是一个模块,其中包含标准购物车具有的所有方法(add_product,remove_product,get_total等),如果我想覆盖任何这些方法,我只需使用模块设置购物车的box_behavior_type属性即可。有我想要覆盖的功能。 为了避免与接口不兼容,我正在构建具有向后兼容的自定义字段的可扩展模块,即。标准方法add_product(product,amount)实现为add_product(product,amount,* custom_data),如果custom_data为nil,则调用super方法,有效调用BoxStandardMethods上实现的方法

Ruby非常适合这种方法!该系统现已投入生产一周左右,我完全没有问题!