class Child < Parent

Prévia grátis 2 min de leitura

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

  1. class Child < Parent: herdando os métodos de um pai (esta aula)
  2. Sobrescrevendo um Método do Pai: substituindo comportamento herdado de propósito
  3. Chamando super: reaproveitando a lógica de um método do pai em vez de descartá-la
  4. A Cadeia de Ancestors: .ancestors, o caminho de busca que o Ruby segue
  5. ApplicationRecord Também É Herança: ligando isso ao Article
  6. Escolhendo Herança com Sabedoria: quando o < se encaixa, e quando não
  7. 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.

Aula 1 de 7 · grátis

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.

Digite para buscar...