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_これらのメソッドを利用したい2 つの異なるインスタンスがあることに気付きました (どちらも同じフォーマットの文字列、つまり Well-Known Text (WKT) でした)。上記の 2 つのメソッドの正確なコピーを特定の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 (この場合) をその親以外の別のクラスから継承させようとする私の素朴さは、この主題に関する私の知識のギャップを非常に明確に強調していると思います

別の親から派生した 2 つのクラスに追加の共有メソッドを実際に移植するには、どのメソッドを使用できるでしょうか? 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'

この例では、2 つの既存のクラスXとがありYます。と私が呼び出したモジュールの両方Xに追加したいメソッドを定義します。その後、両方を再度開き、モジュールをそれらに含めることができます。それが完了すると、 と の両方に元のメソッドと のメソッドが追加されます。YMixinXYMixinXYMixin

于 2013-08-07T05:30:23.180 に答える