我有一个Base
超和一堆派生类的,像Base::Number
, Base::Color
。 我想可以,如果我从他们继承说使用这些子类Fixnum
中的情况下Number
。
什么是做到这一点的最佳方式,同时还具有响应它们适当地is_a? Base
is_a? Base
?
所以,我应该能够做到
Number.new(5) + Number.new(6) # => 11
Number.new.is_a? Base # => true
我想我可以混合式底座,并覆盖is_a?kind_of? 和instance_of? 方法,但希望有一个更清洁的方式。
这实际上是用很简单的Ruby:
module Slugish
attr_accessor :slug
def loud_slug
"#{slug}!"
end
end
class Stringy < String
include Slugish
end
class Hashy < Hash
include Slugish
end
hello = Stringy.new("Hello")
world = Stringy.new("World")
hello.slug = "So slow"
world.slug = "Worldly"
hello.loud_slug #=> "So slow!"
world.loud_slug #=> "Worldly!"
hello.is_a?(Slugish) #=> true
world.is_a?(Slugish) #=> true
"#{hello} #{world}" #=> "Hello World"
stuff = Hashy.new
stuff[:hello] = :world
stuff.slug = "My stuff"
stuff.loud_stug #=> "My stuff!"
stuff.is_a?(Slugish) #=> true
为什么你坚持使用is_a?/ kind_of? 当的respond_to? 是检查的东西更清洁的方式吗? 如果希望对象实现一个接口/合同不被任何任意选择超类的子类。 但是,也许我在这里失去了某种要求。
编辑 :我明白你的推理,但它往往导致不良OO /动态设计。 无论你正在做这样的事情,这可能是叶类,但在一个框架应该继承来解决一个可以接受的想法:
if a.is_a?(something)
#do something
elif a.is_a?(something_else)
#do something else
...
或者是这样的:
if !a.is_a?(something)
#raise condition/return null/etc.
endif
...
我认为让代码失败, 不明白在消息传递例外基于语言是一个完美的设计决策。
作为一个额外的问题,用is_a? 代替的respond_to? 限制你使用实体模型对象,而单元测试的能力。 它可以是甚至中度复杂的代码相当大的问题。
我认为你正在使用继承正确,如果你有完全不相关的类,如“数字”和“颜色”从同一个基类派生的所有。 我会用成分来代替,如果他们需要访问同一个程序(不知道为什么他们会虽然)。
Ruby的相当于多重继承的混入。 这听起来像你对我想要的是基地是在获取对几类混合的模块。