Classes de design e uso
Na programação orientada a objetos (OOP), as classes são os blocos de construção de um aplicativo. Compreender a relação entre classes e objetos é essencial.
- Classes são os esquemas que os desenvolvedores usam para definir as propriedades (dados) e métodos (comportamentos) de objetos. As classes fornecem uma maneira de encapsular dados e comportamento, facilitando a organização e o gerenciamento de código.
- Objetos são instâncias de classes. Quando uma classe é instanciada, um objeto é criado na memória. Cada objeto tem seu próprio conjunto de propriedades e métodos, mas compartilha a mesma estrutura definida pela classe.
Examinar os objetos do mundo real ao seu redor pode ajudá-lo a entender como as classes e os objetos funcionam na programação. Os objetos no mundo real têm atributos (propriedades) e comportamentos (métodos) que definem sua finalidade e funcionalidade. Por exemplo, um carro é um objeto com atributos como marca, modelo e cor, e comportamentos como dirigir e parar.
Objetos do mundo real
As pessoas interagem com objetos constantemente em suas vidas diárias. Na verdade, quase tudo com que interagimos pode ser pensado como um objeto.
Os seguintes critérios podem ser usados para definir objetos no mundo real:
- Os objetos são as coisas que podemos ver e tocar.
- Os objetos têm uma finalidade.
- Os objetos têm partes que apoiam o seu propósito.
Um lápis é um exemplo de um objeto físico. O objetivo de um lápis é criar uma nota ou um desenho. As partes de um lápis incluem o corpo, a ponta e talvez uma borracha. As peças trabalham juntas para alcançar a finalidade pretendida do lápis.
Há também objetos físicos que existem como uma montagem de outros objetos. A lista a seguir fornece exemplos de objetos que são compostos de outros objetos:
- Um carro: O objetivo de um carro é fornecer transporte terrestre para indivíduos e famílias. As peças de um carro incluem um motor, as rodas, um volante, e muitos outros. As partes de um carro trabalham juntas para permitir o transporte terrestre.
- Uma casa: O objetivo de uma casa é fornecer abrigo. As partes de uma casa incluem uma fundação, paredes externas, um telhado e quartos. Estas partes trabalham em conjunto para criar um espaço de vida.
- Um telefone inteligente: O objetivo de um telefone inteligente é ajudar o usuário com tarefas e atividades do dia-a-dia. As partes de um telefone inteligente incluem uma tela, um microprocessador, memória e armazenamento, uma bateria, câmeras e botões. Essas partes trabalham juntas para permitir recursos de comunicação, entretenimento e produtividade.
Cada parte de um carro, casa ou smartphone é um objeto com sua própria finalidade e também pode ser um conjunto de objetos.
Atributos e recursos de um objeto físico
Reserve um minuto para considerar o exemplo de um lápis. Um lápis tem partes (corpo, ponta, borracha) e uma finalidade (criar uma nota ou desenho). Os lápis partilham estas características básicas. No entanto, nem todos os lápis são iguais.
Alguns lápis são curtos, outros são longos. Alguns lápis são amarelos, outros são pretos. Alguns lápis têm uma ponta sem brilho, outros têm uma ponta afiada. Alguns lápis têm uma borracha, outros não têm uma borracha.
Os atributos de um objeto são frequentemente divididos nas seguintes categorias físicas e comportamentais:
- Físico: Os atributos físicos são os aspetos de um objeto que podem ser vistos ou medidos.
- Comportamentais: Atributos comportamentais são os aspetos de um objeto que descrevem suas capacidades ou interações com outros objetos.
Para o exemplo do lápis, os atributos físicos incluem o comprimento do corpo, a cor do corpo, a nitidez da ponta e se o lápis tem ou não uma borracha. Os atributos comportamentais incluem a capacidade de escrever, a capacidade de apagar e a capacidade de ser afiado. Um lápis interage com papel ou outros objetos sólidos que podem ser escritos ou desenhados.
Os atributos físicos são muitas vezes referidos como propriedades, enquanto os atributos comportamentais são frequentemente referidos como funções (métodos na programação em C#).
Classes de código e objetos em programação C#
No mundo da programação em C#, as propriedades e os métodos do objeto são definidos por uma classe. As classes fornecem o esquema para o que um objeto (uma instância da classe) é capaz de fazer. O esquema para uma classe é chamado de definição de classe.
Quando um aplicativo está em execução, o computador usa uma definição de classe para alocar memória para um objeto (uma instância da classe). O computador usa o esquema para configurar um bloco de memória do tamanho certo para o objeto. Um objeto é basicamente um bloco de memória.
Os objetos de código, assim como os objetos físicos, podem ter valores diferentes atribuídos às suas propriedades.
As classes encapsulam dados e comportamento
As classes fornecem uma maneira de encapsular dados e comportamento. Encapsulamento é o processo de combinar dados e comportamento em uma única unidade. As classes usam propriedades para habilitar o acesso a dados e métodos para habilitar comportamentos.
Propriedades da classe
As propriedades de classe são usadas para gerenciar os dados que diferenciam um objeto (instância de classe) de outro objeto do mesmo tipo.
As propriedades de classe permitem que os objetos leiam, gravem ou calculem o valor de variáveis (campos de dados) definidas dentro da classe. As propriedades aparecem como membros de dados públicos, mas são implementadas como métodos especiais chamados acessadores de . Esse recurso permite que os chamadores acessem os dados facilmente e ainda ajuda a promover a segurança e a flexibilidade dos dados.
Os valores de propriedade podem ser lidos usando um acessador de get e atribuídos usando um acessador de set.
Métodos de classe
Os métodos de classe definem as ações (comportamentos) que uma classe pode executar.
Os métodos podem usar parâmetros que fornecem dados de entrada e podem retornar dados de saída por meio de parâmetros. Os métodos também podem retornar um valor diretamente, sem usar um parâmetro.
Por exemplo, a classe Console inclui métodos WriteLine, ReadLinee Clear (entre outros). Esses métodos ajudam a habilitar os comportamentos pretendidos da classe Console. Os métodos podem ser usados para executar ações, como cálculos, manipulação de dados ou interação com outros objetos.
Os métodos geralmente são projetados para aceitar um ou mais argumentos de método. Os argumentos do método são passados para o método como parâmetros da instrução de chamada usada para invocar o método. Por exemplo, o método WriteLine da classe Console pode aceitar um argumento string fornecido pela instrução de chamada.
Definições de classe no código C#
O exemplo a seguir mostra uma classe simples em C#. A classe Phone tem propriedades para Brand, Modele Year. A classe também inclui métodos para Call e Text.
public class Phone
{
public string? Brand { get; set; }
public string? Model { get; set; }
public int Year { get; set; }
public void Call(string phoneNumber)
{
Console.WriteLine($"Calling {phoneNumber}...");
}
public void Text(string phoneNumber, string message)
{
Console.WriteLine($"Texting {phoneNumber}: {message}");
}
}
Usando namespaces
Na programação em C#, os namespaces são usados de duas maneiras:
- A biblioteca de classes .NET usa namespaces para organizar suas muitas classes.
- Os desenvolvedores declaram seus próprios namespaces para ajudar a controlar o escopo de nomes de classe e método em projetos de programação maiores.
Namespaces na biblioteca de classes .NET
Os namespaces são usados pela biblioteca de classes .NET para agrupar tipos relacionados, facilitando sua localização e uso.
Considere o seguinte trecho de código:
System.Console.WriteLine("Hello World!");
Neste exemplo, System é um namespace e Console é uma classe nesse namespace.
Fornecer o nome totalmente qualificado da classe (System.Console) garante que a classe correta seja usada. No entanto, usar nomes totalmente qualificados pode ser complicado ao trabalhar com muitas classes do mesmo namespace. Para melhorar a legibilidade do código, você pode usar a diretiva using. A diretiva using permite que você use tipos definidos em um namespace sem especificar o namespace totalmente qualificado desse tipo.
O trecho de código a seguir implementa a diretiva using para melhorar a legibilidade do código:
using System;
Console.WriteLine("Hello World!");
Observação
A partir do .NET 6, diretivasglobal using implícitas são adicionadas aos novos projetos C#. Isso significa que você pode usar tipos definidos nesses namespaces sem precisar especificar seu nome totalmente qualificado ou adicionar manualmente uma diretiva using. O aspeto implícito refere-se ao fato de que as diretivas de uso global são adicionadas a um arquivo gerado no diretório obj do projeto. Esse recurso permite que você use Console.WriteLine sem declarar explicitamente using System ao desenvolver aplicativos nas versões 6.0 ou posteriores do .NET.
Organizando classes com namespaces
Declarar seus próprios namespaces pode ajudá-lo a controlar o escopo de nomes de classe e método em projetos de programação maiores. Use a palavra-chave namespace para declarar um namespace.
Considere o seguinte trecho de código:
namespace SampleNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine("SampleMethod inside SampleNamespace");
}
}
}
O nome do namespace deve ser um nome de identificador C# válido.
Você pode declarar um namespace para todos os tipos definidos nesse arquivo, conforme mostrado no seguinte trecho de código:
namespace SampleNamespace;
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine("SampleMethod inside SampleNamespace");
}
}
class AnotherSampleClass
{
public void AnotherSampleMethod()
{
System.Console.WriteLine("AnotherSampleMethod inside SampleNamespace");
}
}
A vantagem desta nova sintaxe é que é mais simples, poupando espaço horizontal e chaves. Isso torna seu código mais fácil de ler.
Visão geral dos namespaces
Os namespaces têm as seguintes propriedades:
- Eles organizam grandes projetos de código.
- Eles são delimitados usando o operador
.. - A diretiva
usingevita o requisito de especificar o nome do namespace para cada classe. - O namespace global é o namespace "raiz":
global::Systemsempre se refere ao namespace .NET System.
O uso de namespaces para agrupar tipos relacionados facilita a localização e o uso deles.