3

假设您有以下 Ruby 类:

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

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

是否有可能以仍然使用原始定义而不修改greetB方式重新定义?CC

(我知道“你做错了”是一种可能的反应,但请暂时假设这样做是有充分理由的。)

更新

很高兴看到另一个演示 Ruby 可以让您为所欲为。但是,对于任何发现这个问题并想这样做的人,我应该说我最终意识到我做错了;C 需要直接继承 A。

继续阅读以接收您的霰弹枪,并注意您的目标。:)

4

2 回答 2

5

您可以执行以下操作:

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

这意味着 B 知道您要更改其版本,greet但仅适用于其他已故类,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 回答