【Ruby】super

在Ruby中,super 关键字用于调用父类/超类的方法,尤其是在子类重写了父类的方法时。它在面向对象编程中有很多用途,可以帮助你复用父类的代码逻辑或者增强其功能。下面详细介绍 super 的使用方法及其不同的变体。

使用 super

当一个类继承自父类时,可以使用 super 调用父类的方法。这在重写(或“覆写”)方法时特别有用,使得子类可以扩展父类的方法,而不是完全替代它们。

以下是 super 的不同用法:

1. 直接使用 super

直接使用 super 会调用父类同名方法,并自动传递所有的参数,也包括块(如果有)。

class Parent
  def greet(name)
    puts "Hello, #{name}!"
  end
end

class Child < Parent
  def greet(name)
    super # 调用父类的greet方法
    puts "Welcome, #{name}!"
  end
end

child = Child.new
child.greet("Alice")

输出:

Hello, Alice!
Welcome, Alice!

2. 使用 super() 带括号但没有参数

如果使用 super() 带有括号,但没有参数,那么父类方法将被调用并且不会传递任何参数。

class Parent
  def greet(name)
    puts "Hello, #{name}!"
  end
end

class Child < Parent
  def greet(name)
    super() # 调用父类的greet方法,但不传递参数
    puts "Welcome!"
  end
end

child = Child.new
child.greet("Alice")

输出:

Hello, !
Welcome!

3. 使用 super 并显式传递参数

可以显式地传递参数给 super

class Parent
  def greet(name)
    puts "Hello, #{name}!"
  end
end

class Child < Parent
  def greet(name)
    super(name + " Smith") # 调用父类的greet方法,并传递修改后的参数
    puts "Welcome, #{name}!"
  end
end

child = Child.new
child.greet("Alice")

输出:

Hello, Alice Smith!
Welcome, Alice!

代码块与 super

当父类方法接受一个代码块时,super 也可以将代码块传递给父类方法。

class Parent
  def greet(name)
    puts "Hello, #{name}!"
    yield if block_given?
  end
end

class Child < Parent
  def greet(name)
    super do
      puts "Block from the child."
    end
    puts "Welcome, #{name}!"
  end
end

child = Child.new
child.greet("Alice") do
  puts "Block from the greet call."
end

输出:

Hello, Alice!
Block from the greet call.
Block from the child.
Welcome, Alice!

小结

  • super: 调用父类方法并自动传递所有参数及代码块。
  • super(): 调用父类方法但不传递任何参数及代码块。
  • super(arguments): 调用父类方法并传递显式指定的参数,不传递代码块。
  • super { block }: 调用父类方法并传递代码块。

通过理解和使用 super,可以更有效地重用代码并遵循面向对象编程的最佳实践。它允许你在子类中扩展和增强父类的行为,而不是从头开始重新实现功能。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值