Ruby:是否可以重新定义方法但保持子类不变?

时间:2012-10-26 13:59:16

标签: ruby

假设您有以下Ruby类:

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

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

是否可以在greet上重新定义BC仍然使用原始定义而不修改C

(我明白“你做错了”是一个可能的反应,但请假设有一个很好的理由这样做。)

更新

很高兴再次看到Ruby会让你做任何你想做的事情。但是,对于任何发现这个问题并想到这样做的人,我应该说我最终意识到我做错了; C需要直接子类化A.

继续阅读以接收霰弹枪,并观察瞄准目标的位置。 :)

2 个答案:

答案 0 :(得分:5)

您可以执行以下操作:

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

这意味着B知道您要更改其greet的版本,但仅适用于B而不是其他任何死亡类。

答案 1 :(得分:2)

当班级为“B”时,做你的事,否则叫super:

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

如果继承不断推动你添加这样的棘手事情,你可能会玩模块。这是一个有趣的阅读on Ruby inheritance vs. modules