我有一个班级Item
和另一个Weapon
。它们共享很多相同的状态(例如size
,value
),但Weapon
有一些额外的内容,例如damage
,critical
和{{ 1}}。在原始Ruby中,我将这些公共属性提取到模块并组合它们,或者我可以从threat
继承Weapon
并将公共状态放在超类中。
除了我正在使用Rails。单表继承似乎不是一个很好的解决方案,因为Item
有许多属性不在Weapon
中,我不喜欢所有空DB列。多态关联也不正确,因为它似乎更有用于共享模型之间的关联,而不是共享状态。使用关注:大致相同的问题。
Rails中有什么东西允许我在另一个模型中扩展单个模型的状态,同时为任何其他属性构建一个额外的表吗?
这是我在原始Ruby中喜欢的代码示例:
Item
在Rails中,可以尝试将class Item
attr_accessor :value, :weight, item_type
class Weapon < Item
attr_accessor :damage, :threat, :critical, :weapon_type
Weapon.new(value: 12) # => weapon instance with value 12
添加到item_id
- 但是我不能Weapon
,我必须Weapon.new(value: 12)
。
答案 0 :(得分:0)
TL; DR这违反了Liskov Substitution Principle,所以我不应该这样做。
根据Liskov的说法,对象子类型应该是可以互换的 - 也就是说,如果我为Weapon
或者Weapon
切换Potion
,那么使用Gem
类实例的方法应该有效$(document).ready(function () {
setInterval(function() {
$.ajax({
url: '/number.php',
type: 'get',
success: function (output) {
$(document.body).append(output); }
});
}, 1000);
});
。显然,事实并非如此:所以从OOP的角度来看,我不应该在这里使用继承。
感谢您的辩论!