Programação Orientada a Objetos - Módulo 9 (PDF)
Document Details
Agrupamento de Escolas Henriques Nogueira
Tags
Summary
Este documento é um módulo que introduz a Programação Orientada a Objetos (POO), usando exemplos e explicações claras e concisas em português.
Full Transcript
# AGRUPAMENTO DE ESCOLAS HENRIQUES NOGUEIRA ## PROGRAMAÇÃO E SISTEMAS DE INFORMAÇÃO # MÓDULO 9 - Introdução à Programação Orientada a Objetos ## Objetivos do módulo: No final deste módulo os alunos devem ter adquirido conhecimentos, procedimentos e atitudes que lhe permitam: - Identificar as dif...
# AGRUPAMENTO DE ESCOLAS HENRIQUES NOGUEIRA ## PROGRAMAÇÃO E SISTEMAS DE INFORMAÇÃO # MÓDULO 9 - Introdução à Programação Orientada a Objetos ## Objetivos do módulo: No final deste módulo os alunos devem ter adquirido conhecimentos, procedimentos e atitudes que lhe permitam: - Identificar as diferenças entre uma Linguagem Estruturada e uma Linguagem Orientada por Objetos; Adquirir a noção de objetos e sua classificação; - Adquirir as noções de classe, tipo, métodos, comportamentos e instâncias; - Representar esquematicamente uma classe; - Compreender o conceito de encapsulamento de dados. ## 1. Caraterísticas da programação Orientada por Objetos A programação orientada por objetos (POO) é um estilo de programação (ou um paradigma de programação). Existem vários paradigmas de programação como seja a programação estruturada. Linguagens de programação como o C, Pascal e Fortran são linguagens estruturadas, pois a sua estrutura depende de funções e do seu código. Estas dão mais importância ao código. As linguagens de programação orientadas por objetos dão prioridade aos dados. A solução encontra- se definindo primeiro os dados e depois as funções que manipulam esses dados. Nas linguagens POO os programas decompõem os problemas com módulos que representam objetos do mundo real, estes objetos são conhecidos como classes. As classes são comos os tipos de dados pois estas permitem definir variáveis do seu tipo, as variáveis definidas a partir de uma classe são os objetos ou instâncias/cópias. | Linguagem de Programação Estruturada | Variáveis | Classes | Linguagem POO | Objetos | |---|---|---|---|---| | Tipo de Dados | int | class Carro{ } | | Carro novo = new Carro() | | int | int X; x=1 0; | | | | ## 2. Conceito de Classe, Atributos, Métodos e eventos Uma classe define um objeto com base nas suas propriedades (os campos ou variáveis) e as suas ações ou métodos que definem o seu comportamento (funções). Assim um objeto tem dois tipos de membros, os dados e os métodos. Estes membros podem ter diferentes tipos de dados, incluindo outros objetos. A classe pode ainda herdar membros de outras classes, permitindo reutilizar classes criadas para servirem de base para outras classes. ``` class Carro { string marca; string modelo; public void defineMarca (string marca) { this.marca = marca; } public void defineModelo (string modelo) { this.modelo = modelo; } } ``` ## 3. Conceito de Objeto Um objeto é uma variável criada a partir de uma classe. É o objeto que vai poder armazenar dados e executar funções sobre esses dados. Ao criar um objeto a partir de uma classe estamos a criar uma cópia em memória das propriedades dessa classe, assim podem existir diferentes cópias da mesma classe bastando para isso definir diferentes objetos a partir da mesma classe. Estas cópias partilham o código, ou seja, as diferentes instâncias da classe só são diferentes pelos valores das suas propriedades, pois os métodos são os mesmos para a mesma classe. ``` Carro carro = new Carro(); Carro carro2 = new Carro(); carro.defineMarca(“Ford”); carro2.defineMarca(“BMW”); ``` ## 4. Conceito de Encapsulamento A ideia do encapsulamento é que os dados de um objeto só devem ser manipulados por funções desse mesmo objeto. O objetivo é proteger os dados evitando erros validando os dados antes de os armazenar. ## 5. Conceito de visibilidade de classes, métodos e atributos O conceito de encapsulamento está associado à visibilidade dos membros, assim os membros que definimos como privados (por defeito) só podem ser utilizados pelas funções dentro da classe. Os dados de uma classe devem ser privados, pois só devem ser alterados pelos métodos da classe. As funções podem ser privadas ou publicas, pois, o objetivo é poderem ser chamadas por outras funções de outras classes. As próprias classes podem ser definidas como visíveis por outros namespaces (public) ou só para uso interno do namespace do programa (internal). No exemplo apresentado acima as propriedades são privadas (private), pois apesar de não ser indicado nenhum tipo de visibilidade por defeito estas são privadas, ao passo que as funções são publicas (foi indicado o nível de visibilidade public). Em c# existem os seguintes níveis de visibilidade: | Nível de visibilidade/proteção | Descrição | |---|---| | private | Elemento só visível dentro da classe onde foi declarado | | public | Elemento visível em qualquer classe | | protected | Elemento visível dentro da classe onde foi declarado e nas classes derivadas | | internal | Elemento visível em qualquer classe exceto fora do namespace | | protected internal | Elemento visível dentro da classe onde foi declarado e nas classes derivadas, exceto fora do namespace | ## 6. Herança Herança é um mecanismo que permite criar classes a partir de outras classes. Considere os seguintes objetos com as respetivas propriedades. | Veículo | Combustível | Matrícula | |---|---|---| | Carro | Nr | Nr Portas | | Camiã | Peso Máximo | Reboque | Se Carro fosse uma classe derivada de Veículo então Carro herdava as propriedades e os métodos de veículos. | Veículo | Combustível | Matrícula | |---|---|---| | Carro | Nr | Nr | | | Combustível | Matrícula | Deste modo o código e os dados de veículo são reutilizados. Em algumas linguagens de programação podemos criar classes derivadas a partir de outras classes derivadas. Assim se a classe Camião fosse derivada a partir de Carro ficava assim: | Camiã | Peso Máximo | Reboque | |---|---|---| | | Nr Lugares | Nr Portas | | | Combustível | Matrícula | Em C# não é possível fazer heranças múltiplas. As classes derivadas são também chamadas classes filhas, enquanto a classe base pode ser denominada por mãe (alguns autores preferem a versão masculina filhos e pai). Em algumas linguagens de programação a classe base é uma superclasse, e as classes derivadas são subclasses. Dentro de uma classe a palavra reservada *this* permite fazer referência a elementos dessa própria classe, distinguindo de parâmetros ou outros elementos com nomes iguais. Em C# podemos fazer referência aos elementos das classes superiores a partir da classe derivada utilizando a palavra *base*. As classes derivadas podem redefinir os métodos, isto que dizer que uma classe derivada pode criar um método novo para substituir um método da classe base, para isso deve utilizar o mesmo nome no método. Só pelo facto de se ter definido uma classe derivada a partir de outra não quer dizer que não se possam criar objetos a partir da classe base. Antes de utilizar a herança devemos pensar bem se as classes têm uma relação de herança ou por outro lado a relação é de composição, uma classe pode ser composta por outras classes como seus membros. Normalmente devemos pensar se se trata de uma relação de *é* ou se a relação é de *tem*. Quando a relação pode ser definida como uma relação de *é*, por exemplo um carro é um veículo, então estamos perante uma herança. Se a relação pode ser definida como *tem*, um carro tem volante, nestes casos não existe uma relação, mas uma classe que tem outra como um membro. Se existir uma classe que só pode ser derivada então temos uma classe abstrata, neste caso a classe não pode ser instanciada para criar objetos diretamente. Por vezes temos necessidade de saber qual o tipo de objeto que estamos a manipular, uma vez que graças à herança podemos ter diferentes tipos de objeto na mesma variável. Para isso existe o operador *is* que permite testar se um objeto é de um determinado tipo. Esta função devolve verdadeiro se o objeto for testado com a sua classe ou com a classe de onde esta é derivada, ou seja, a classe base. ## 7. Polimorfismo e redefinição Uma classe pode implementar métodos existentes noutras classes, mesmo nas classes derivadas. O compilador ao chamar a função avalia o objeto e executa a função adequada de acordo com a classe do objeto. Os métodos podem ser redefinidos dentro da mesma classe desde que tenham parâmetros ou um valor de retorno diferentes. ## 8. Construtores e destrutores Um construtor é uma função com o mesmo nome da classe que é executada quando o objeto é criado. Esta função permite definir os valores iniciais do objeto. O destrutor é uma função com o mesmo nome da classe, mas com um (til) no início do nome. Esta função é chamada automaticamente quando o objeto é destruído. O objetivo desta função é libertar recursos que o objeto alocou. ## 9. Libertar objeto Quando um objeto já não é necessário pode ser libertado utilizando a palavra reservada *null*. Basta igualar o objeto a *null* para o destruir. Esta instrução, no entanto, não garante que o destrutor seja chamado pois o C# implementa um coletor de lixo (garbage collector) que faz a gestão da memória garantindo que os objetos que não são libertados pelo código do programador são libertados pela framework do .Net, evitando fugas de memória. ## 10. Classes e membros estáticos Uma classe estática é um conjunto de funções agrupadas dentro de uma classe. Neste caso não é possível criar objetos a partir desta classe, ou seja, não se pode instanciar a classe. Todos os programas em C# têm uma classe estática com o nome *Program* que implementa a função *Main*, também estática, e é a partir desta classe e função que o código começa a ser executado. Todos os outros elementos são tratados como classes, incluindo os formulários e os controlos dentro destes, porque na prática são classes. Os membros estáticos de uma classe, mesmo numa classe que não é estática, são chamados pelo nome da classe e não pelo nome do objeto, isto porque na prática são membros da classe e independentes do objeto. No caso de propriedades estáticas estas são partilhadas pelos diferentes objetos. Os membros estáticos podem ser utilizados para criar variáveis globais, desde que sejam públicas. ## 11. Interfaces Uma interface permite que duas classes partilhem os mesmos membros desde que estes tenham o mesmo tipo de retorno e os mesmos parâmetros. A interface é a definição de quais os métodos e os parâmetros que devem ser definidos para que a classe possa ser considerada de um determinado tipo ou classe. Uma interface só tem métodos, não tem propriedades. ## 12. Diagramas de classe Para representar as classes podemos utilizar um diagrama. Nesse diagrama representamos a classe, os seus membros, a visibilidade destes bem como as relações entre as diferentes classes. O diagrama da classe está dividido em três partes, a primeira apresenta o seu nome, a segunda, as propriedades e os seus tipos de dados e por fim os métodos. ``` Carro marca: String modelo: String define Marca(marca: String) define Modelo(modelo: String) define Tudo(marca: String,modelo: String) ``` Também podemos incluir a visibilidade dos membros da classe: | Símbol | Descrição | |---|---| | + | Publico | | - | Privado | | # | Protegido | | / | Derivado (pode-se combinar com um dos anteriores) | | ~ | Estático | Quando temos várias classes podemos representar a herança entre as classes assim: | Classe base | | Classe derivada | |---|---|---| | Propriedades | | Propriedades | | Métodos | → | Métodos | ## Referências: - http://en.wikipedia.org/wiki/Class_diagram - http://msdn.microsoft.com/en-us/library/79b3xss3(v=vs.90).aspx - C# 5.0 com Visual Studio 2012 - Curso Completo