A Palavra-chave 'base'
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 20 de 70.
Quando uma classe derivada herda de uma classe base, você frequentemente precisa acessar os membros da classe pai diretamente. A palavra-chave base fornece essa conexão, permitindo que você chame o construtor da classe base ou acesse seus métodos e propriedades.
O uso mais comum de base é chamar o construtor da classe pai. Ao criar um objeto derivado, você pode passar valores para a classe base:
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
public class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, string breed) : base(name)
{
Breed = breed;
}
}A sintaxe : base(name) chama o construtor Animal antes que o corpo do construtor Dog seja executado. Isso garante que a classe base seja inicializada corretamente primeiro.
Você também pode usar base para chamar métodos pai de dentro da classe derivada:
public class Animal
{
public void Speak()
{
Console.WriteLine("Animal sound");
}
}
public class Dog : Animal
{
public void Speak()
{
base.Speak(); // Chama o Speak do Animal
Console.WriteLine("Woof!");
}
}Aqui, base.Speak() chama explicitamente a versão do método da classe pai. Isso é útil quando você deseja estender o comportamento da classe pai em vez de substituí-lo completamente.
Desafio
FácilVamos construir um sistema de inventário de produtos que demonstra como as classes derivadas usam a palavra-chave base para inicializar corretamente sua classe pai e estender o comportamento herdado.
Você criará três arquivos para organizar seu código:
Product.cs: Defina uma classeProductno namespaceInventory. Esta classe base representa qualquer produto com uma propriedadeName(string) e uma propriedadePrice(decimal). Inclua um construtor que aceite ambos os valores e um métodoGetInfo()que retorne"{Name}: ${Price}".ElectronicProduct.cs: Defina uma classeElectronicProductno namespaceInventoryque herda deProduct. Esta classe adiciona uma propriedadeWarrantyMonths(int). O construtor deve aceitar nome, preço e meses de garantia - usebasepara passar o nome e o preço para o construtor pai. Crie um métodoGetInfo()que primeiro chama oGetInfo()do pai usandobase, e então anexa" (Warranty: {WarrantyMonths} months)"para estender a saída.Program.cs: No seu arquivo principal, crie umElectronicProductusando os valores de entrada e exiba suas informações completas chamandoGetInfo().
Você receberá três entradas:
- Nome do produto
- Preço
- Meses de garantia
Imprima o resultado da chamada de GetInfo() no seu produto eletrônico.
Por exemplo, se as entradas forem Laptop, 999.99, e 24, a saída deve ser:
Laptop: $999.99 (Warranty: 24 months)Observe como a classe derivada constrói sobre a saída da classe base em vez de duplicar a lógica. A palavra-chave base permite que você reutilize e estenda o comportamento do pai perfeitamente!
Folha de consulta
A palavra-chave base permite que uma classe derivada acesse membros de sua classe pai.
Use base para chamar o construtor da classe pai:
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
}
public class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, string breed) : base(name)
{
Breed = breed;
}
}A sintaxe : base(name) chama o construtor pai antes que o corpo do construtor da classe derivada seja executado, garantindo a inicialização adequada.
Use base para chamar métodos pai a partir da classe derivada:
public class Animal
{
public void Speak()
{
Console.WriteLine("Animal sound");
}
}
public class Dog : Animal
{
public void Speak()
{
base.Speak(); // Chama o Speak de Animal
Console.WriteLine("Woof!");
}
}Isso permite que você estenda o comportamento do pai em vez de substituí-lo completamente.
Experimente você mesmo
using System;
using Inventory;
class Program
{
public static void Main(string[] args)
{
// Ler as entradas
string name = Console.ReadLine();
decimal price = Convert.ToDecimal(Console.ReadLine());
int warrantyMonths = Convert.ToInt32(Console.ReadLine());
// TODO: Criar um ElectronicProduct com os valores de entrada
// TODO: Imprimir o resultado da chamada de GetInfo() no seu produto eletrônico
}
}
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 POO
Arquivos ExternosNamespaces e DiretivasIntrodução a Classes e ObjetosA Palavra-chave 'this'Métodos e ParâmetrosCampos vs PropriedadesConstrutoresInicializadores de ObjetosRecapitulação - Calculadora Simples4Herança
Sintaxe Básica de Herança (:)A Palavra-chave 'base'Palavras-chave Virtual e OverrideClasses SeladasA Classe Base 'object'Recapitulação - Hierarquia de Funcionários7Recursos Avançados
Sobrecarga de OperadoresIndexadores (this[])Sobrescrita de ToString()Métodos de ExtensãoRecapitulação - Lista Personalizada10Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoSingleton Thread-SafePadrão FactoryPadrão Observer (Eventos)Padrão Strategy2Propriedades e Membros Estáticos
Propriedades AutoimplementadasPropriedades de Apenas Leitura/EscritaCampos e Métodos EstáticosClasses EstáticasMembros com Corpo de Expressão5Polimorfismo e Interfaces
Polimorfismo: Compilação vs ExecuçãoInterface vs Classe AbstrataMúltiplas InterfacesInterfaces ExplícitasUpcasting e DowncastingRecapitulação - Calculadora de Formas8Conceitos Avançados de POO
Composição sobre HerançaGenerics (Classes e Métodos)Delegates e EventosAtributos e ReflectionIDisposable e a Instrução usingFundamentos de Injeção de Dependência11Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão Composite3Arquitetura de Classes
Dados de Instância vs EstáticosPalavras-chave 'readonly' e 'const'Campos de SuporteRecapitulação - Gerenciador de Conta Bancária6Encapsulamento
Modificadores de AcessoPropriedades para EncapsulamentoImplementação de Ocultação de DadosPadrões de ImutabilidadeRecapitulação - Registros de Estudantes9Argumentos Variáveis
A Palavra-chave 'params'Parâmetros OpcionaisArgumentos NomeadosSobrecarga de Métodos