Ruby Language Qu'est-ce qui est hérité?


Exemple

Les méthodes sont héritées

class A
  def boo; p 'boo' end
end

class B < A; end

b = B.new
b.boo # => 'boo'

Les méthodes de classe sont héritées

class A
  def self.boo; p 'boo' end
end

class B < A; end

p B.boo # => 'boo'

Les constantes sont héritées

class A
  WOO = 1
end

class B < A; end

p B::WOO # => 1

Mais méfiez-vous, ils peuvent être remplacés:

class B
  WOO = WOO + 1
end

p B::WOO # => 2

Les variables d'instance sont héritées:

class A
  attr_accessor :ho
  def initialize
    @ho = 'haha'
  end
end

class B < A; end

b = B.new
p b.ho # => 'haha'

Attention, si vous remplacez les méthodes qui initialisent les variables d’instance sans appeler super , elles seront nulles. En continuant d'en haut:

class C < A
  def initialize; end
 end

c = C.new
p c.ho    # => nil

Les variables d'instance de classe ne sont pas héritées:

class A
    @foo = 'foo'
    class << self
        attr_accessor :foo
    end
end

class B < A; end

p B.foo # => nil

# The accessor is inherited, since it is a class method
#
B.foo = 'fob' # possible

Les variables de classe ne sont pas vraiment héritées

Ils sont partagés entre la classe de base et toutes les sous-classes sous la forme d'une variable:

class A
    @@foo = 0
    def initialize
        @@foo  += 1 
        p @@foo
    end
end

class B < A;end

a = A.new # => 1
b = B.new # => 2

Donc en continuant d'en haut:

class C < A
  def initialize
    @@foo = -10
    p @@foo
  end
end

a = C.new # => -10
b = B.new # => -9