Herança Básica
Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy. Lição 36 de 110.
Herança permite que uma classe adquira as propriedades e métodos de outra classe. Em vez de reescrever o mesmo código, você cria uma nova classe que se baseia em uma já existente. A classe original é chamada de pai (ou superclasse), e a nova classe é a filha (ou subclasse).
Em Dart, você usa a palavra-chave extends para herdar de uma classe pai:
class Animal {
String name;
Animal(this.name);
void eat() {
print('$name is eating');
}
}
class Dog extends Animal {
Dog(String name) : super(name);
void bark() {
print('$name says woof!');
}
}
void main() {
var dog = Dog('Buddy');
dog.eat(); // Herdado de Animal
dog.bark(); // Definido em Dog
}A classe Dog tem automaticamente acesso à propriedade name e ao método eat() de Animal, além de seu próprio método bark(). Isso cria uma relação de “é um” — um Dog é um Animal.
A classe filha pode adicionar novas propriedades e métodos, mas herda tudo o que é público da classe pai. Observe que membros privados (aqueles com _) não são acessíveis diretamente em subclasses de bibliotecas diferentes, embora ainda existam no objeto herdado.
Desafio
FácilVamos criar um sistema de veículos que demonstra como a herança permite que classes filhas reutilizem e estendam a funcionalidade da classe pai. Você criará uma classe pai para veículos em geral e uma classe filha para um tipo específico de veículo.
Você organizará seu código em dois arquivos:
vehicle.dart: Defina suas classes aqui:- Uma classe
Vehicle(a classe pai) com uma propriedadeString brand, um construtor que recebe a marca e um métodostart()que imprime[brand] engine starting... - Uma classe
Motorcycleque estendeVehicle. Ela deve ter uma propriedade adicionalint cc(cilindrada do motor), um construtor que recebe a marca e a cilindrada (passando a marca para a classe pai usandosuper) e seu próprio métodowheelie()que imprime[brand] is doing a wheelie!
- Uma classe
main.dart: Importe seu arquivo de veículos e demonstre a herança em ação:- Crie um
Vehiclecom a marca'Toyota' - Chame seu método
start() - Crie uma
Motorcyclecom a marca'Harley'e cilindrada1200 - Chame o método
start()da motocicleta (herdado de Vehicle) - Chame o método
wheelie()da motocicleta (definido em Motorcycle) - Imprima
Motorcycle engine: [cc]ccpara mostrar a própria propriedade da classe filha
- Crie um
Observe como a classe Motorcycle automaticamente obtém acesso à propriedade brand e ao método start() de Vehicle, além de ter sua própria propriedade exclusiva cc e seu próprio método wheelie(). Esse é o poder da herança: construir sobre um código existente.
Saída esperada:
Toyota engine starting...
Harley engine starting...
Harley is doing a wheelie!
Motorcycle engine: 1200ccExperimente você mesmo
import 'vehicle.dart';
void main() {
// TODO: Criar um Vehicle com a marca 'Toyota'
// TODO: Chamar o método start() do veículo
// TODO: Criar uma Motorcycle com a marca 'Harley' e cc 1200
// TODO: Chamar o método start() da motocicleta (herdado de Vehicle)
// TODO: Chamar o método wheelie() da motocicleta
// TODO: Imprimir 'Motorcycle engine: [cc]cc' usando a propriedade cc da motocicleta
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de OOP
Arquivos externosBibliotecas e importsIntrodução à OOPClasses vs. objetosA palavra-chave thisMétodosVariáveis de instânciaNoções básicas de construtoresRevisão - Calculadora simples4Segurança contra nulos
Introdução à segurança contra nulosAnulável vs. não anulávelOs operadores ? e !Palavra-chave Late e segurança contra nulosOperadores conscientes de nulosSegurança contra nulos em classesRecapitulação — Sistema de perfil de usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementação vs. ExtensãoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Genéricos
Visão geral de List, Set e MapColeções com segurança de tiposClasses genéricasMétodos genéricosRestrições genéricasIterable e IteratorRecapitulação - Armazenamento genérico13Conceitos Avançados de OOP
Composição vs. HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Registros (Dart 3)Padrões e Correspondência (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses de Livros e Usuários2Construtores em Dart
Construtor padrãoConstrutores nomeadosListas de inicializaçãoConstrutores constantesConstrutores factoryConstrutores de redirecionamentoRevisão - Construtor de formas5Encapsulamento
Membros Públicos vs. PrivadosConvenção do Prefixo _Privacidade no Nível da BibliotecaAprofundamento em Getters e SettersOcultação de InformaçõesRecapitulação - Registros de Alunos8Mixins
Introdução a MixinsCriando MixinsUsando vários MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema de Animais11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode e ==Interface ComparableMétodo call()Sobrescrita de noSuchMethodRecapitulação - Coleção Personalizada14Padrões de Projeto – Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy3Propriedades de Classe
Membros de Instância vs. EstáticosCampos Final e ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Contas Bancárias6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodosA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do polimorfismoPolimorfismo por meio de interfacesVerificação de tipos em tempo de execuçãoOs operadores is e asPalavra-chave covarianteRecapitulação — Processador de pagamentos12OOP Assíncrona
Futures e async/awaitNoções básicas de StreamsControladores de StreamConstrutores assíncronosAsync em métodos de classeRecapitulação — Buscador de dados15Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão RepositoryPratique por conta própria: Compilador de Dart online