我一直在做一些'猴子修补'(请原谅我超人修补),就像这样,在我的"#{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是否允许这些类型的抽象异常?
答案 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'
在此示例中,我们有两个现有的类X
和Y
。我们在我称为X
的模块中定义了我们想要添加到Y
和Mixin
的方法。然后,我们可以重新打开X
和Y
,并将模块Mixin
包含在其中。完成后,X
和Y
都会使用原始方法和Mixin
中的方法。