1

我一直在做一些“猴子补丁”(对不起,我是超人补丁),就像这样,将以下代码和更多代码添加到我"#{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(不要重复自己)原则之后,开始创建一个特设类,我认为我可能能够从这两个类中继承

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 (在这种情况下)从另一个类而不是其父类继承的天真非常明确地突出了我在这个主题上的知识差距

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

4

1 回答 1

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以及Y在我调用的模块中Mixin。然后我们可以重新打开它们X并将Y模块包含Mixin到它们中。一旦完成,两者X都有Y它们的原始方法以及来自Mixin.

于 2013-08-07T05:30:23.180 回答