从**另一个**类继承而不是实际的父类

时间:2013-08-07 05:23:26

标签: ruby polymorphism multiple-inheritance superclass

我一直在做一些'猴子修补'(请原谅我超人修补),就像这样,在我的"#{Rails.root}/initializers/"文件夹中添加以下代码和更多文件:

module RGeo
 module Geographic
 class ProjectedPointImpl
  def to_s
    coords = self.as_text.split("(").last.split(")").first.split(" ")
    "#{coords.last}, #{coords.first}"
  end# of to_s
  def google_link
    url = "https://maps.google.com/maps?hl=en&q=#{self.to_s}"
  end
 end# of ProjectedPointImpl class
end# of Geographic module
end

我最终意识到有两个不同的_Point_实例,我想利用这些方法(两者都是具有相同格式的字符串,即知名文本(WKT)),并添加了一个精确的副本以上两种方法对某个RGeo::Geos::CAPIPointImpl类空间。

然后,我以年轻,没有经验的方式,在考虑了DRY(不要重复自己)原则之后,继续创建一个 ad hoc 类,我认为我可以继承

class Arghhh
  def to_s
    coords = self.as_text.split("(").last.split(")").first.split(" ")
      "#{coords.last}, #{coords.first}"
  end# of to_s

  def google_link
    url = "https://maps.google.com/maps?hl=en&q=#{self.to_s}"
  end
end

并告诉我的班级继承它,即:ProjectedPointImpl < Arghhh

当我停下来然后尝试重新加载我的rails控制台时,我被ruby及时响应了这个错误:

`<module:Geos>': superclass mismatch for class CAPIPointImpl (TypeError)

...

我认为我试图让CAPIPointImpl(在这种情况下)继承另一个类而不是其父 非常明确地突出了我对这个主题的知识差距< / p>

我可以使用哪些方法将额外的共享方法实际移植到来自其他单独父母的两个类中? ruby是否允许这些类型的抽象异常?

1 个答案:

答案 0 :(得分:4)

您需要做的是在模块中定义新方法,然后将其“混合”到现有类中。这是一个粗略的草图:

# Existing definition of X
class X
  def test
    puts 'X.test'
  end
end

# Existing definition of Y
class Y
  def test
    puts 'Y.test'
  end
end

module Mixin
  def foo
    puts "#{self.class.name}.foo"
  end

  def bar
    puts "#{self.class.name}.bar"
  end
end

# Reopen X and include Mixin module
class X
  include Mixin
end

# Reopen Y and include Mixin module
class Y
  include Mixin
end

x = X.new
x.test # => 'X.test'
x.foo  # => 'X.foo'
x.bar  # => 'X.bar'

y = Y.new
y.test # => 'Y.test'
y.foo  # => 'Y.foo'
y.bar  # => 'Y.bar'

在此示例中,我们有两个现有的类XY。我们在我称为X的模块中定义了我们想要添加到YMixin的方法。然后,我们可以重新打开XY,并将模块Mixin包含在其中。完成后,XY都会使用原始方法和Mixin中的方法。