我见过的大多数继承问题都假设子类具有与超类不同的属性。例如,Person
可能是超类,Driver
可能是子类,其中Driver
包含所有内容Person
加上license_type
字段。
我问的是一个稍微不同的问题。我有一个超类,称之为Entity
,Entity
有一个object_type
字段,描述我们拥有的Entity
类型。所有类型都具有相同的字段,但每种类型的行为略有不同。例如,add
方法对于不同的Entity
类型是不同的。
我目前的解决方案是继承Entity
,每当我提取Entity
时(例如,在find()
或where(..)
中),我都会调用entity = entity.becomes(eval("Entity#{entity.object_type}"))
。这很难看,效果不好,例如url_for
和form_for
将调用未定义的方法,因为类类型为Entity<Type>
,而不是Entity
。
如果没有表继承,我将如何进行模型继承,以便url,路径,表单和其他所有内容仍然按照描述工作?也许我有办法避免打电话给.becomes(..)
?我正在做的事非常难看;)。
答案 0 :(得分:1)
我已经了解了有关Ruby和Rails的更多信息,并且我提出了一个很好的解决方案。我将Entity<Type>
类更改为模块并将它们放在lib/
中。然后,在Entity类中,我有一个after_initialize
回调,如下所示:
if object_type == "Type1"
extend EntityType1
elsif object_type == "Type2"
extend EntityType2
end
这样,EntityType1
和EntityType2
中定义的所有方法都在Entity
类的范围内执行,而不需要任何新的类实例化。到目前为止,解决方案一直运行良好,但我现在只使用它几天了。