Sobrescrita de ToString()
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 38 de 70.
Toda classe em C# herda de object, que fornece um método ToString(). Por padrão, ele retorna o nome do tipo totalmente qualificado - não muito útil quando você deseja ver os dados reais de um objeto.
Você pode sobrescrever ToString() para retornar uma representação de string significativa do seu objeto:
public class Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public override string ToString()
{
return $"{Name} ({Age} years old)";
}
}Agora, quando você imprime ou concatena um objeto Person, você obtém uma saída legível:
Person p = new Person("Alice", 30);
Console.WriteLine(p); // Alice (30 anos)Sem o override, isso imprimiria algo como MyNamespace.Person. A palavra-chave override é obrigatória porque você está substituindo o método herdado de object. Isso é especialmente valioso para depuração e logging, onde você precisa de uma visão rápida do estado de um objeto.
Desafio
FácilVamos construir uma classe Book que forneça representações de string significativas quando impressa, tornando a depuração e a exibição de informações do livro muito mais intuitivas.
Você organizará seu código em dois arquivos:
Book.cs: Crie uma classeBookno namespaceLibraryque represente um livro com seus detalhes essenciais. Seu livro deve ter:- Três propriedades somente leitura:
Title(string),Author(string) eYear(int) - Um construtor que aceita title, author e year nessa ordem
- Um método
ToString()sobrescrito que retorna uma string formatada:"{Title}" by {Author} ({Year})
- Três propriedades somente leitura:
Program.cs: No seu arquivo principal, crie um objetoBookusando os valores de entrada e imprima-o diretamente. Graças à sua sobrescrita deToString(), passar o objeto do livro paraConsole.WriteLine()exibirá automaticamente as informações formatadas em vez do nome do tipo.
Você receberá três entradas:
- Título do livro (string)
- Nome do autor (string)
- Ano de publicação (inteiro)
Imprima o objeto do livro diretamente usando Console.WriteLine().
Por exemplo, se as entradas forem The Great Gatsby, F. Scott Fitzgerald e 1925, a saída deve ser:
"The Great Gatsby" by F. Scott Fitzgerald (1925)A mágica aqui é que você não está chamando ToString() explicitamente - quando você passa um objeto para Console.WriteLine(), ele chama automaticamente o método ToString() do objeto. Sua sobrescrita torna essa saída útil em vez de apenas mostrar Library.Book!
Folha de consulta
Cada classe em C# herda de object, que fornece um método ToString(). Por padrão, ele retorna o nome do tipo totalmente qualificado.
Sobrescreva ToString() para retornar uma representação de string significativa:
public class Person
{
public string Name { get; }
public int Age { get; }
public Person(string name, int age)
{
Name = name;
Age = age;
}
public override string ToString()
{
return $"{Name} ({Age} years old)";
}
}Quando você imprime um objeto, ToString() é chamado automaticamente:
Person p = new Person("Alice", 30);
Console.WriteLine(p); // Alice (30 anos de idade)A palavra-chave override é necessária ao substituir um método herdado de object.
Experimente você mesmo
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// Ler a entrada
string title = Console.ReadLine();
string author = Console.ReadLine();
int year = Convert.ToInt32(Console.ReadLine());
// TODO: Criar um objeto Book usando os valores de entrada
// TODO: Imprimir o objeto book diretamente usando Console.WriteLine()
}
}
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