多重继承型类继承的红宝石(Multiple-Inheritance type class inher

2019-09-17 22:20发布

我有一个Base超和一堆派生类的,像Base::NumberBase::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? 方法,但希望有一个更清洁的方式。

Answer 1:

这实际上是用很简单的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


Answer 2:

为什么你坚持使用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? 限制你使用实体模型对象,而单元测试的能力。 它可以是甚至中度复杂的代码相当大的问题。



Answer 3:

我认为你正在使用继承正确,如果你有完全不相关的类,如“数字”和“颜色”从同一个基类派生的所有。 我会用成分来代替,如果他们需要访问同一个程序(不知道为什么他们会虽然)。



Answer 4:

Ruby的相当于多重继承的混入。 这听起来像你对我想要的是基地是在获取对几类混合的模块。



文章来源: Multiple-Inheritance type class inheritance in ruby