class Child < Parent
O símbolo que todo curso de Rails core usou, sem explicação
class Article < ApplicationRecord
end
Essa linha aparece desde o primeiro curso de Rails core. O curso Classes Ruby e initialize explicou class, initialize e attr_accessor, ou seja, tudo nessa linha menos um caractere: <. Esse símbolo significa herança: Article herda de ApplicationRecord. Este curso explica o que você ganha com isso.
Um segundo BankAccount, construído a partir do primeiro
class BankAccount
def initialize(starting_balance)
@balance = starting_balance
end
def deposit(amount)
@balance += amount
end
def withdraw(amount)
return "insufficient funds" if amount > @balance
@balance -= amount
end
def balance
@balance
end
end
class SavingsAccount < BankAccount
end
savings = SavingsAccount.new(100)
savings.deposit(50)
savings.balance
# => 150
O corpo de SavingsAccount está vazio. Não define deposit, nem withdraw, nem balance, e mesmo assim savings.deposit(50) e savings.balance funcionam. Com class SavingsAccount < BankAccount, todo método que BankAccount define fica disponível também em SavingsAccount, sem copiar uma linha.
SavingsAccount é um BankAccount
savings.is_a?(BankAccount)
# => true
savings.class
# => SavingsAccount
savings.class continua sendo SavingsAccount, a própria classe, e is_a?(BankAccount) também é true. A herança não renomeia SavingsAccount. Ela faz dessa classe um tipo de BankAccount, então onde o código espera um BankAccount, um SavingsAccount serve.
Por que não copiar os métodos
Escrever deposit, withdraw e balance de novo dentro de SavingsAccount também funcionaria. Aí BankAccount precisa de uma correção ou de um método novo, e cada cópia tem de ser atualizada à mão. Com class SavingsAccount < BankAccount existe uma definição só, toda subclasse a reaproveita, e nenhuma cópia fica desatualizada.
O que este curso cobre
- class Child < Parent: herdando os métodos de um pai (esta aula)
- Sobrescrevendo um Método do Pai: substituindo comportamento herdado de propósito
- Chamando super: reaproveitando a lógica de um método do pai em vez de descartá-la
- A Cadeia de Ancestors:
.ancestors, o caminho de busca que o Ruby segue - ApplicationRecord Também É Herança: ligando isso ao
Article - Escolhendo Herança com Sabedoria: quando o
<se encaixa, e quando não - Juntando Tudo: uma pequena hierarquia combinando tudo, apontando para módulos em seguida
O curso termina na cadeia de Article: Article herda de ApplicationRecord, que herda de ActiveRecord::Base. A aula 4 confere essa cadeia no Catalog::Course desta app.
Continue com a aula 2
Sobrescrevendo um método do pai
OverdraftAccount redefine withdraw, e o Ruby roda primeiro a versão do filho, mantendo os outros métodos herdados.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.