服务端相关 / 37 Ruby的inherit和inherited

Ruby 的inherit 和 inherited

众所周知,继承是面向对象语言的重要概念,Ruby作为一门面向对象的编程语言,也提供了继承的功能,本章节我主要讲Ruby是如何继承的。

1. Ruby中如何继承

Ruby通过 子类 < 基/父类 这种形式来实现继承。

实例:

class Person
  def name
    "My name is Andrew"
  end
end

class Member < Person
end

puts Member.new.name

# ---- 输出结果 ----
My name is Andrew

解释:上面的例子中,类Member继承了类Person,所以Member增加了名为name的实例方法。

继承不光可以继承实例方法,同样也可以继承类方法。

实例:

class Person
  def self.say_hello
    "Hello"
  end
  
  def name
    "My name is Andrew"
  end
end

class Member < Person
end

puts Member.say_hello

# ---- 输出结果 ----
Hello

Tips:在Ruby中每个类只能继承一次,不能多重继承。不过我们可以通过混入的方式,将模块中的方法混入进类中,从而达到多重继承的效果。

注意事项:我们所指的多重继承是这样的形式:

class A inherits class B
class A inherits class C

而不是:

class A inherits class B
class B inherits class C

当继承的类中所含的方法和自身方法名相同的时候,保留自身的方法,忽略继承的方法。

实例:

class Person
  def name
    "My name is Person"
  end 
end

class Member < Person

  def name
    "My name is Member"
  end 

end

puts Member.new.name

# ---- 输出结果 ----
My name is Member

2. inherited

当一个类被继承的时候,会触发inherited钩子方法,相当于被继承时的通知。

实例:

class Person
  def self.inherited(klass)
    puts "#{klass} inherited #{self}"
  end
  
  def name
    "My name is Andrew"
  end
end

class Member < Person
end

puts Member.new.name

# ---- 输出结果 ----
Member inherited Person
My name is Andrew

解释:当类Person被继承后,触发了inherited钩子方法,打印了“Member inherited Person”。

3. 小结

本章节我们学习了继承,继承使用<符号,当类继承一个类的时候,会将继承的类中的实例方法和类方法都移植过来。一个类只能继承一个类。当继承的类中所含的方法和自身方法名相同的时候,保留自身的方法,忽略继承的方法。另外,当一个类被继承的时候,会触发inherited回调,并返回操作的类名。