【问题标题】:Ruby - Is there a way to call a method of the superclass with the same name of a method overloadedRuby - 有没有办法用重载方法的同名调用超类的方法
【发布时间】:2013-04-05 22:08:40
【问题描述】:

是否可以这样做:

class A
  def a(var)
    puts "do something with #{var}"
  end
end

class B < A
  def a(var)
    var = var + "some modification"
    #this is what I want to do:
    super.a(var)
  end
end

谢谢!

【问题讨论】:

标签: ruby oop


【解决方案1】:

除非我误读了您的问题,否则您应该可以自己拨打super;例如:

class A
  def a(var)
    puts "do something with #{var}"
  end
end

class B < A
  def a(var)
    var = var + "some modification"
    #this is what I want to do:
    #super.a(var)
    super
  end
end

v = B.new
v.a("hey")

生产

$ ruby test.rb
do something with heysome modification

【讨论】:

  • 如果你像这样调用super,它会将它的参数传递给父函数(通常是你想要的)。你也可以调用super()(空参数列表)来调用没有参数的父函数,或者super("whatever")用你想要的任何参数显式调用父方法。
【解决方案2】:

您不能在 super 调用中使用方法名称

如果您单独使用super,那么它将调用super 类的实现并传递相同的参数

class A
  def a(var)
    puts var
  end
end

class B < A
  def a(var)
    super
  end
end

B.new.a(1) #=> 1

如果您想修改变量,则可以重新分配 var arg 或使用 super 调用传入参数

class A
  def a(var)
    puts var
  end
end

class B < A
  def a(var)
    var = 2
    super
  end
end

B.new.a(1) #=> 2

或

class A
  def a(var)
    puts var
  end
end

class B < A
  def a(var)
    super(2)
  end
end

B.new.a(1) #=> 2

【讨论】:

    【解决方案3】:

    试试下面的:

    class A
      def a(var)
        puts "do something with #{var}"
      end
    end
    
    class B < A
      def a(var)
        var = var + "some modification"
        #this is what I want to do:
        #super.a(var)
        self.class.superclass.instance_method(:a).bind(self).call 12
      end
    end
    
    v = B.new
    v.a("hello")
    

    输出:

    do something with 12
    

    另一个:

    class A
      def a(var)
        puts "do something with #{var}"
      end
    end
    
    class B < A
        alias :old_a :a
      def a(var)
        var = var + "some modification"
        #this is what I want to do:
        #super.a(var)
        old_a 12
      end
    end
    
    v = B.new
    v.a("hello")
    

    输出:

    do something with 12
    

    【讨论】:

    • 我认为这是以一种过于复杂的方式解决问题 - 请参阅其他答案
    • @Paul.s alias 是复杂的方式吗?太糟糕了,我刚刚向 OP 展示了我们有多少种方法可以做到这一点。
    • 但是当它被内置到语言中时,为什么要付出额外的努力和复杂性呢?如果 OP 不太了解核心语言,那么元编程就完全遥不可及。
    • 投反对票: 为什么投反对票?在我的代码中说明错误的原因。如果你不明白那并不意味着代码是错误的。你没有能力。所以在判断其他人的代码之前,请阅读更多内容。
    • 我的意思是 super 关键字是为此目的而内置的。因此,重新实现它的功能只是无益且不清楚
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多