A Classe Base 'object'
Parte da seção Programação Orientada a Objetos do Journey de C# da Coddy — lição 23 de 70.
Em C#, cada classe que você cria herda automaticamente de uma classe especial chamada object. Mesmo quando você não especifica explicitamente uma classe base, sua classe ainda tem object como seu ancestral final. Isso significa que cada tipo em C# compartilha um conjunto comum de métodos.
A classe object fornece vários métodos virtuais que você pode sobrescrever em suas próprias classes:
public class Person
{
public string Name { get; set; }
// Sobrescreve de object
public override string ToString()
{
return $"Person: {Name}";
}
public override bool Equals(object obj)
{
if (obj is Person other)
return Name == other.Name;
return false;
}
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}Os três métodos mais comumente sobrescritos são ToString() para representação de string, Equals() para comparar objetos e GetHashCode() para coleções baseadas em hash. Por padrão, ToString() retorna o nome do tipo e Equals() verifica a igualdade de referência.
Como tudo herda de object, você pode armazenar qualquer tipo em uma variável object:
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: AliceEsta classe base universal é o que torna possíveis recursos como coleções que contêm tipos mistos, e é por isso que cada objeto em C# tem acesso a métodos como ToString() e GetType().
Desafio
FácilVamos construir um sistema de comparação de livros que demonstra como a sobrescrita de métodos da classe base object fornece aos seus tipos personalizados comportamentos significativos para representação de string e verificação de igualdade.
Você criará dois arquivos para organizar seu código:
Book.cs: Defina uma classeBookno namespaceLibrary. Seu livro deve ter as propriedadesTitle(string) eAuthor(string), juntamente com um construtor que define ambos os valores. Sobrescreva os três métodos principais herdados deobject:ToString()deve retornar"{Title} by {Author}"Equals(object obj)deve retornartruese o outro objeto for umBookcom o mesmoTitleeAuthorGetHashCode()deve combinar os códigos de hash de ambas as propriedades
Program.cs: No seu arquivo principal, crie dois livros usando valores de entrada. Exiba cada livro usandoToString(), depois verifique se eles são iguais e imprima o resultado. Por fim, demonstre que você pode armazenar umBookem uma variável do tipoobjecte ainda obter uma saída significativa ao chamarToString().
Você receberá quatro entradas:
- Título do primeiro livro
- Autor do primeiro livro
- Título do segundo livro
- Autor do segundo livro
Imprima a saída neste formato:
Book 1: {ToString result}
Book 2: {ToString result}
Are they equal? {True/False}
Stored as object: {ToString result of first book stored in object variable}Por exemplo, se as entradas forem 1984, George Orwell, 1984 e George Orwell, a saída deve ser:
Book 1: 1984 by George Orwell
Book 2: 1984 by George Orwell
Are they equal? True
Stored as object: 1984 by George OrwellSe as entradas forem 1984, George Orwell, Brave New World e Aldous Huxley, a saída deve ser:
Book 1: 1984 by George Orwell
Book 2: Brave New World by Aldous Huxley
Are they equal? False
Stored as object: 1984 by George OrwellObserve como seus métodos sobrescritos dão aos objetos Book um comportamento significativo - eles são exibidos de forma amigável como strings e podem ser comparados pelo seu conteúdo, em vez de apenas pelas suas referências de memória!
Folha de consulta
Em C#, toda classe herda automaticamente da classe object, que fornece vários métodos virtuais que podem ser sobrescritos:
Métodos Comuns da Classe Object para Sobrescrever
ToString()- Retorna uma representação em string do objeto (o padrão retorna o nome do tipo)Equals(object obj)- Compara objetos para igualdade (o padrão verifica a igualdade de referência)GetHashCode()- Retorna um código hash para uso em coleções baseadas em hash
Sobrescrevendo Métodos da Classe Object
public class Person
{
public string Name { get; set; }
// Sobrescreve ToString para representação em string personalizada
public override string ToString()
{
return $"Person: {Name}";
}
// Sobrescreve Equals para comparação baseada em conteúdo
public override bool Equals(object obj)
{
if (obj is Person other)
return Name == other.Name;
return false;
}
// Sobrescreve GetHashCode para coleções baseadas em hash
public override int GetHashCode()
{
return Name?.GetHashCode() ?? 0;
}
}Classe Base Universal
Qualquer tipo pode ser armazenado em uma variável object:
object item1 = new Person { Name = "Alice" };
object item2 = 42;
object item3 = "Hello";
Console.WriteLine(item1.ToString()); // Person: AliceEssa herança universal permite coleções que contêm tipos mistos e garante que cada objeto tenha acesso a métodos como ToString() e GetType().
Experimente você mesmo
using System;
using Library;
class Program
{
public static void Main(string[] args)
{
// Ler a entrada para dois livros
string title1 = Console.ReadLine();
string author1 = Console.ReadLine();
string title2 = Console.ReadLine();
string author2 = Console.ReadLine();
// TODO: Criar dois objetos Book usando os valores de entrada
// TODO: Imprimir Book 1 usando ToString()
// Formato: "Book 1: {ToString result}"
// TODO: Imprimir Book 2 usando ToString()
// Formato: "Book 2: {ToString result}"
// TODO: Verificar se os livros são iguais e imprimir o resultado
// Formato: "Are they equal? {True/False}"
// TODO: Armazenar o primeiro livro em uma variável object e imprimi-lo
// Formato: "Stored as object: {ToString result}"
}
}
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