3

次のRubyクラスがあるとします。

class A
  def self.greet
    puts 'hi'
  end
end

class B < A; end;
class C < B; end;

変更せずに元の定義を使用するような方法で再定義greetすることは可能ですか?BCC

(「あなたはそれを間違っている」というのはおそらく反応だと理解していますが、これを行うのには十分な理由があるとしばらく考えてください。)

アップデート

Rubyがあなたがやりたいことを何でもできるというさらに別のデモンストレーションを見るのは良いことです。しかし、この質問を見つけて同じようにやろうと考えている人には、私は最終的に自分が間違ったことをしていることに気づいたと言わなければなりません。CはAを直接サブクラス化する必要がありました。

あなたのショットガンを受け取るために読んで、あなたがそれを狙っているところを見てください。:)

4

2 に答える 2

5

次のようなことができます。

def B.greet
  puts self == B ? 'beeeee' : super
end

greetこれは、Bがそのバージョンを変更したいことを認識していることを意味しBます。

于 2012-10-26T14:05:27.747 に答える
2

クラスが「B」の場合は自分のことを行い、それ以外の場合は super を呼び出します。

class B
  def self.greet
    if self == B
      puts "my new self"
    else
      super
    end
  end
end

継承によって、このようなトリッキーなものを追加し続ける場合は、モジュールで遊ぶ方法があるかもしれません。Rubyの継承とモジュールに関する興味深い読み物を次に示します。

于 2012-10-26T14:16:39.810 に答える