【问题标题】:Extending a Ruby parent class' method with a different-named method使用不同名称的方法扩展 Ruby 父类的方法
【发布时间】:2013-10-08 02:15:35
【问题描述】:

我有一个类 Parent 和一个类 Child(它是 Parentchild 子类)。

  • Parent 有一个名为 aaaa 的方法。
  • Child 有一个名为 bbbb 的方法。

这就是我想要实现的目标:

  • 我希望bbbb 成为aaaa 的扩展。如果我在Child 对象上调用aaaa,它将运行aaaa 通常会执行的操作,以及bbbb 中的其他操作。
  • 调用bbbb 将执行与上述相同的操作(运行aaaa 通常会执行的操作,然后执行bbbb 中的其他操作)。

这就是我最终做的:

class Parent

  def aaaa
    print "A"
  end

end

class Child < Parent

  alias_method :original_aaaa,:aaaa
  def bbbb
    original_aaaa
    print "B"
  end
  alias_method :aaaa,:bbbb

end

c = Child.new
c.aaaa # => AB
c.bbbb # => AB

有效。我猜。但感觉真的很hackish。另外,这样做的一个缺点是,如果我想在定义 bbbb 之前或之后使用相同的名称扩展 aaaa,事情会变得有点奇怪。

有没有更简单的方法来实现这一点?

【问题讨论】:

  • 问题是……为什么?!
  • 我可以看到这样做的原因。这个问题对如何处理有一些想法:stackoverflow.com/questions/2564391/…
  • “孩子”是什么意思?你是说子类吗?
  • 您似乎在以一种误导的方式使用“扩展”一词。该术语保留的意思与您可能的意思不同。您应该使用不同的术语。
  • @sawa:谢谢。你会建议我使用什么?

标签: ruby class inheritance


【解决方案1】:
class Parent
  def aaaa
    print "A"
  end
end

class Child < Parent
  def aaaa
    super
    print "B"
  end
  alias bbbb :aaaa
end

【讨论】:

  • 当我阅读这个问题时,这似乎是显而易见的答案,但是 OP 如何提出这个问题的复杂性让我相信super 不是解决方案的充分策略。我会期待他们对您的回答作出回应。
  • @NewAlexandria:不,我只是个笨蛋 :)
  • 愚蠢到可以很好地提出这个问题。
【解决方案2】:

感谢以上回答@sawa 下面我喜欢分享我的用例: 超级是按订单工作!

   class Parent
      def aaaa
        print "A"
      end
    end
    
    class Child < Parent
      def aaaa
        super
        print "B"
      end
      alias bbbb :aaaa
    end
    
    Class Grand < Child
      def aaaa
        print "C"
        super
      end
    end
    => :aaa
    
    g = Grand.new
    g.aaaa #=> CAB

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多