Skip to content

Latest commit

 

History

History
239 lines (160 loc) · 13.1 KB

File metadata and controls

239 lines (160 loc) · 13.1 KB

8 Programação Baseada em Objetos

8.1 Introdução

Vamos ver brevemente alguns conceitos importantes e terminologia da orientação a objetos. A orientação a objetos usa classes para encapsular dados (atributos) e métodos (comportamentos). Os objetos tem a capacidade de ocultar sua implementação de outros objetos. Embora alguns objetos possam se comunicar uns com os outros, por meio de interfaces bem definidas, os objetos não sabem como os outros são implementados.

Em linguagens de programação procedimentais (Como C), a programação tende a ser orientada a ações. A programação C#, entretanto, é orientada a objetos.

8.2 Implementado um Tipo de Dados Abstrato de Tempo com uma Classe

As classes em C# facilitam a criação de tipos de dados abstratos (TDAs), os quais ocultam sua implementação dos clientes. Um problema das linguagens de programação procedimentais é que o código cliente frequentemente é dependente dos detalhes da implementação dos dados usados no código. Essa dependência pode provocar a reescrita do código cliente, caso a implementação dos dados mude. Os TDAs eliminam esse problema, fornecendo interfaces independentes da implementação para seus clientes.

  • Fig. 8.01: Time1.cs
    A classe Time1 mantém o tempo no formato de 23 horas.

As palavras-chave public e private são modificadores de acesso a membro.

As classes frequentemente contêm métodos de acesso que podem ler ou apresentar dados. Os métodos de acesso também são usados para testar a veracidade de condições (Tais métodos são frequentemente chamados de métodos predicados).

Note que o arquivo TimeTest1.cs não usa a palavra-chave using para importar o espaço de nomes que contém a classe Time1. Se uma classe está no mesmo espaço de nomes que a classe a utiliza, a instrução using não é exigida.

Time1 é nosso primeiro exemplo de classe que não contém o método Main. Assim, a classe Time1 não pode ser usada para iniciar a execução do programa.

Uma classe contendo o método Main também é conhecida como ponto de entrada do programa.

8.3 Escopo de CLasse

As variáveis de instância e métodos de uma classe pertencem ao escopo dessa classe. Dentro do escopo de uma classe, os membros da classe são imediatamente acessíveis a todos os métodos dessa classe e pode ser referenciados pelo nome.

Se uma variável está definida em um métodos, apenas esse método pode acessar a variável. Diz-se que tais variáveis têm escopo de bloco. Uma variável de instância oculta pode ser acessada em um método precedendo-se seu nome com a palavra-chave this e o operado ponto.

8.4 Controlando o Acesso aos Membro

Os modificadores de acesso a membro public e private controlam o acesso aos dados e métodos de uma classe.

(Omitido aqui: acessores get e set. Será visto em códigos)

  • Fig. 8.03: RestrictedAccess.cs
    Demonstra erros de compilação da tentativa de acessar membros de classe privados.

8.5 Inicializando Objetos de uma Classe: Construtores

Quando um programa cria uma instância de uma classe, ele chama o construtor da classe para inicializar as variáveis de instância dessa classe. Uma classe pode conter construtores sobrecarregados para fornecer várias maneiras de inicializar objetos dessa classe.

Ao criar um objeto de uma classe, o programador pode fornecer inicializadores entre parênteses, à direita do nome da classe. Esses inicializadores são os argumentos do construtor. Em geral, as declarações assumem a forma

NomeClasse ReferênciaAObjeto = new NomeClasse(argumentos);

8.6 Usando Construtores Sobrecarregados

Assim como os métodos, os construtores de uma classe podem ser sobrecarregados.

04: Time2.cs
A classe Time2 fornece construtores sobrecarregados.

Os construtores não especificam tipos de retorno; fazer isso resulta em erros de sintaxe.
Além disso, observe que cada construtor recebe um número diferente ou diferentes tipos de argumentos.

  • Fig. 8.05: TimeTest2.cs
    Usando construtores sobrecarregados.

8.7 Propriedades

Os métodos de uma classe podem manipular variáveis de instância private dessa classe. Frequentemente, as classes fornecem propriedades public para permitir aos clientes configurarem ou obterem variáveis de instância private. Fornecer recursos de set e get parece ser o mesmo que tornas as variáveis de instância public.

  • Fig. 8.06: Time3.cs
    A classe Time3 fornece propriedades get e set.

Os acessores set dessas propriedades controlam rigorosamente a configuração das variáveis de instância com valores válidos.

  • Fig. 8.07: TimeTest3.cs
    Demonstrando as propriedades Hour, Minute e Second de Time3.

8.8 Composição: Referências a objetos como variáveis de instância de outras classes

Em muitas situações, referenciar objetos existentes é mais conveniente do que reescrever o código dos objetos para novas classes em novos projetos.

  • Fig. 8.08: Date.cs
    A definição da classe Date encapsula mês, dia e ano.

O aplicativo das figuras 8.8, 8.9 e 8.10 demonstra a composição. O programa contém três classes.

A classe Date encapsula informações relacionadas a uma data específica.
A classe Employee encapsula o nome do funcionário e dois objetos Date representando a data de nascimento e de contratação do funcionário.
A classe CompositionTest cria uma objeto da classe Employee para demonstrar a composição.

  • Fig. 8.09: Employee.cs
    A definição da classe Employee encapsula o primeiro nome, o sobrenome, a data de nascimento e a data de contratação do funcionário.

  • Fig. 8.10: CompositionTest.cs
    Demonstra um objeto com referência a um objeto membro.

8.9 Usando a Referência this

  • Fig. 8.11: Time4.cs
    A classe Time4 fornece construtores sobrecarregados.

Todo objeto pode acessar uma referência a sim mesmo, chamada de referência this. A referência this pode se referir implicitamente às variáveis de instância, propriedades e métodos de um objeto.

8.10 Coleta de Lixo

No exemplos anteriores vimos como um construtor inicializa dados em um objeto de uma classe após o objeto ser criado. O operador new aloca memória para o objeto e, então, chama o construtor desse objeto.

Ao contrário do C e do C++, o C# realiza o gerenciamento de memória internamente. A plataforma realiza a coleta de lixo da memória para retornar a memória do sistema que não é mais necessária. A falha na liberação desses recursos causa estouros de recursos

8.11 Membros de Classe static

Cada objeto de uma classe tem sua própria cópia de todas as variáveis de instância da classe. Entretanto, em certos casos, todos os objetos da classe devem compartilhar apenas uma cópia de uma variável em particular. Tais variáveis são chamadas de variáveis static. Um programa contém apenas uma cópia de cada uma das variáveis static de uma classe na memória, independentemente de quantos objetos da classe tenham sido instanciados. Uma variável static representa informações em nível de classe.

  • Fig. 8.13: Employee.cs
    A classe Employee contém dados estáticos e um método estático.

Um método static não pode acessar membros de instância (não static). Ao contrário dos métodos de instância, um método static não tem referência this, pois as variáveis static existem independentemente de todos os objetos de classe, mesmo quando não existem objetos dessa classe.

  • Fig. 8.14: StaticTest.cs
    Demonstrando membros de classe estáticos.

O coleto de lixo não é chamado diretamente pelo programa. O coletor de lixo reclama a memória usada pelos objetos quando o ambiente de execução determina que a coleta de lixo é apropriada ou o sistema operacional recupera memória quando o programa termina. Entretanto, é possível solicitar que o coletor de lixo tente coletar os objetos disponíveis.

8.12 Membros const e readonly

O C# permite que os programadores criem constantes cujos valores não podem mudar durante a execução do programa.

Os membros de dados declarados como const são static implicitamente e devem ser inicializados em sua declaração. Os membros de dados declarados como readonly podem ser inicializados em sua declaração ou no construtor de suas classes.

Nem valores const nem readonly podem ser modificados.

8.13 Indexadores

Às vezes uma classe encapsula dados que um programa pode manipular como uma lista de elementos. Tal classe pode definir propriedades especiais chamadas indexadores, que permitem acesso indexados às listas de elementos no estilo de um array.

Uma vantagem dos indexadores é que o programador pode definir índices inteiros e não inteiros.

  • Fig. 8.16: IndexerTest.cs
    Os indexadores fornecem acesso aos membros de um objeto por meio de um operador de índice.

8.14 Abstração de Dados e Ocultamento de Informações

As classes normalmente ocultam os detalhes de sua implementação de seus clientes. Isso é chamado de ocultamento de informações. Como um exemplo de ocultamento de informações, vamos considerar uma Estrutura de dados chamada pilha(stack).

As pilhas são conhecidas como estruturas de dados do tipo último a entrar, primeiro a sair (LIFO - last-in, first-out).

(Pode ser útil pesquisar mais sobre)

8.15 Reutilização de Software

Os programadores de C# se concentram em fazer novas classes e em reutilizar classes da FCL, que contém milhares de classes predefinidas. Os desenvolvedores constroem software combinando classes definidas pelo programador com classes bem definidas, cuidadosamente testadas, bem documentadas, portáveis e amplamente disponíveis na FCL. Esse tipo de reutilização de software acelera o desenvolvimento de software poderoso e de alta qualidade. o RAD (Rapid Application Development) é de grande interesse atualmente.

8.16 Espaços de Nomes e Assemblies

Os programadores devem se concentrar em tornar reutilizáveis os componentes de software que criam. Entretanto, fazer isso frequentemente resulta em colisões de nomes.

  • Fig. 8.17: TimeLibrary.cs
    Colocando a classe Time3 em um assembly para reutilização.

    Tentar compilar código que contém colisão de nomes gerará erros de compilação.

Os espaços de nomes ajudam a minimizar esse problema, fornecendo uma convenção para nomes de classe exclusivos.

Ao reutilizarem definições de classe entre programas, os programadores criam bibliotecas de classes que podem ser importadas para uso em um programa por meio de uma instrução using. Apenas as classes public podem ser reutilizadas a partir das bibliotecas de classes. As classes não public só podem ser usadas por outras classes no mesmo assembly.

  • Fig. 8.19: AssemblyTest.cs
    Usando a classe Time3 do assembly TimeLibrary.

8.17 Class View e Object Browser

O recurso Class View apresenta as variáveis e métodos de todas as classes de um projeto.
O Object Browser do Visual Studio relaciona todas as classes da biblioteca C#.

(Pode ser bom pesquisar mais sobre)