0

クラスの一部のインスタンスのクラスメソッドをオーバーライドする必要があります

class Foo
  def eigen_class
    class << self
      self
    end
  end

  def self.foo
    "original foo"
  end

  def override_foo
    class << self
      def self.foo
        "overridden foo"
      end
    end
  end
end

foo = Foo.new
foo.override_foo
foo.class.foo # => "original foo"
foo.eigen_class.foo # => "overridden foo"

foo2 = Foo.new
foo2.eigen_class.foo # => "original foo"

固有クラスを明示的に取得せずにオーバーライドされたメソッドを呼び出す方法はありますか?

4

2 に答える 2

0

そのメソッドを間違ったコンテキストに割り当てています。修正は次のとおりです。

class << foo.class
  def foo
    "foo"
  end
end

これにより、メソッドは、その特定のインスタンスの固有クラスではなく、Fooクラスにボルトで固定されます。

于 2012-11-19T16:36:40.290 に答える
0

の実装はfooインスタンスごとに異なる可能性があるため、単純に通常のメソッド (つまり、クラス メソッドではなくインスタンス メソッド) を使用することをお勧めします。これは、モジュールを使用して非常に簡単に行うことができ、すべてのオーバーライドを自己完結型に保ちます。

module FooOverrides
  def foo
    "overridden foo"
  end
end

class Foo
  def foo
    "original foo"
  end

  def override_foo
    self.extend(FooOverrides)
  end
end

foo = Foo.new
foo.override_foo
foo.foo # => "overridden foo"

foo2 = Foo.new
foo2.foo # => "original foo"

または、本当に を呼び出したい場合はfoo.class.foo、オーバーライド#classして eigen_class を返すことができます。

class Foo
  def override_foo
    class << self
      def self.foo
        "overridden foo"
      end

      def class
        eigen_class
      end
    end
  end
end

一般に、Object like で定義されたメソッドをオーバーライドする#classことは、意図しない結果をもたらす可能性があるため、適切ではありません。

于 2012-11-19T18:37:04.973 に答える