Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação Orientada a Objeto 1 Classes As classes representam o fundamento da orientação por objetos. Uma classe em C# funciona como uma estrutura, onde podemos acrescentar não só campos mas também funções a uma estrutura. Isto permite "empacotarmos" uma estrutura de dados junto como os procedimentos que irão manipular com esta estrutura. Por exemplo, se quisermos criar uma estrutura de dados para armazenar um triângulo, as funções para desenhar, redimensionar, calcular perímetro, área, etc. ficariam indistintamente associadas a estrutura de dados do tipo triângulo. Classe é o termo técnico utilizado em linguagens orientadas a objetos que descreve um conjunto de dados estruturados que são caracterizados por propriedades comuns. Também pode ser interpretado como uma estrututura modular completa que descreve as propriedades estáticas e dinâmicas dos elementos manipulados pelo programa. Pode-se definir classes de objetos como a descrição de um grupo de objetos por meio de um conjunto uniforme de atributos e serviços. Uma classe é um conjunto de objetos que compartilham as mesmas operações. Enquanto um objeto individual é uma entidade concreta que executa algum papel no sistema como um todo, uma classe captura a estrutura e o comportamento comum a todos os objetos que são relacionados. Um objeto possui uma identidade e suas características serão definidas para a classe. Uma classe é definida por: ? um nome da classe; ? o nome da sua superclasse; ? o nome de suas variáveis privadas; ? os nomes e as definições de todas as operações associadas a esta classe; Classe é um conceito estático: uma classe é um elemento reconhecido num texto de programa. por outro lado, um objeto é um conceito puramente dinâmico, o qual pertence não ao texto do programa, mas à memória do computador, local onde os objetos ocupam espaço durante a execução. (Conceitualmente, classes não são necessárias durante a execução, mas em linguagens interpretadas elas podem ser mantidas). ATRIBUTOS Um atributo é um dado para o qual cada objeto tem seu próprio valor. Atributos são, basicamente, a estrutura de dados que vai representar a classe. MÉTODOS Métodos são declarados dentro de uma classe para representar as operações que os objetos pertencentes a esta classe podem executar. Um método é a implementação de uma rotina, ou seja, o código propriamente dito. Pode ser comparado a um procedimento ou função das linguagens imperativas. 1.1 Definição public class <Nome da classe> { <Visibilidade: public/ private/ protected> <Visibilidade: public/ private/ protected> < lista de atributos > Construtor <Visibilidade: public/ private/ protected> < lista de declaração de métodos > } Exemplo: public class Aluno { //aqui vem os atributos public Aluno(){} //aqui vem os métodos } 1.1.1 Visibilidade Cada "campo" da classe é chamado de "membro" da classe. A área de declaração de uma classe é dividida em sub- áreas determinadas pela sua visibilidade. A visibilidade determina se uma outra parte do programa que declare ou utilize uma variável do tipo da classe, ou Objeto da Classe vai ou não poder acessar seus membros, ou seja escrever algo do tipo: ... Aluno a; a.media() - isto só é possível se "media()" for um membro público. ... A Orientação por Objetos foi desenvolvida com a finalidade de melhor dividir e integrar o desenvolvimento de sistemas. Num projeto grande, classes são desenvolvidas por uma equipe para serem utilizadas no código desenvolvido por outra equipe. Desta forma, a visibilidade permite a limitação de acesso da classe sendo desenvolvida por uma equipe. Pública: Todos os membros públicos podem ser acessados a vontade pelo resto do programa. Geralmente as funções, ou métodos, são sempre públicos. Palavra chave: public: Exemplo: public class Aluno { private string nome; private double nota1,nota2; public double media() { return ((nota1 + nota1)/2); } static void Main() { double x; Aluno a1 = new Aluno; a1.nota1 = 4.5; //Isto irá gerar um erro de compilação, pois nota1 não é pública. x = a1.media(); } } Privada: Quando nada for declarado no corpo de uma classe em C# os membros serão privados por default. Em geral desejamos que os "campos", ou atributos de uma classe sejam privados, para impedir que outros usuários da classe acessem os valores dos dados. Palavra chave: private: ou, por default, qualquer membro é privado. Como não podemos acessar diretamente os "campos" da classe, cada vez que criamos uma nova variável do tipo da classe precisamos ter algum método para poder alterar seus valores. Exemplo: public class Aluno { private string nome; private double nota1,nota2; public double Media() { return ((nota1 + nota1)/2); } public void Iniciar(double n1, double n2) { nota1=n1; nota2=n2; } static void Main() { double x; Aluno a1 = new Aluno; a1.Iniciar(5,6); //Nota 1 e 2 são modificadas através de um método público x = a1.media(); } } Protegida: A visibilidade protegida é similar a privada, contudo permite que os atributos possam ser acessados pelos filhos da classe(veja herança mais adiante). Palavra chave: protected: - Passa a ser visível para os filhos da classe 1.2 Objetos X Variáveis Cada vez que criamos uma "variável do tipo da classe" dizemos que estamos criando um "objeto da classe". Estes objetos podem ser estáticos ou dinâmicos, assim como qualquer variável em C comum. A criação dinâmica obviamente necessita de uma "destruição" ou "apagamento" no final da utilização daquele objeto no programa. O que caracteriza a programação orientada a objetos são os objetos. De um modo geral podemos encarar os objetos como sendo os objetos físicos do mundo real, tal como: carro, avião, cachorro, casa, telefone, computador, etc., por isso que às vezes é dito que orientação a objetos representa os problemas mais próximo ao mundo real, dando assim mais facilidade a programação como um todo, mais isso não é sempre verdade, porque às vezes temos problemas que são extremamente funcionais1. Nesses problemas funcionais é difícil representar a estrutura lógica em torno de objetos. Com isso, não são todos os problemas que giram em torno dos objetos facilmente visíveis. De maneira simples, um objeto é uma entidade lógica que contém dados e código para manipular esses dados. Os dados são denominados como sendo atributos do objeto, ou seja, a estrutura que o objeto tem, e o código que o manipula denominamos método. Um método é uma função que manipula a estrutura de dados do objeto. Um objeto é um ente independente, composto por: ? estado interno, uma memória interna em que valores podem ser armazenados e modificados ao longo da vida do objeto. ? comportamento, um conjunto de ações pré-definidas (métodos), através das quais o objeto responderá a demanda de processamento por parte de outros objetos. Por exemplo: 1funcionais: gira em torno de processos Uma tela de computador pode ter os seguintes atributos e métodos: atributos modo de operação /* texto/gráfico */ tamanho horizontal tamanho vertical paleta de cores cor atual métodos modo texto ( ) modo gráfico ( ) fecha modo gráfico ( ) muda cor ( ) escreve caracter ( ) coloca pixel ( ) muda dimensões (x,y) ... Um guarda-roupa: estrutura conjunto de roupas /* tipo, tamanho, cor, estilo, preço, etc. */ portas número de portas capacidade máxima métodos abre porta ( ) fecha porta ( ) escolhe roupa ( ) tira roupa ( ) coloca roupa ( ) estado do guarda-roupa ( ) /* portas abertas e fechadas, quantidade de roupas,etc. */ ... Uma lista: estrutura (nodo e um apontador para um próximo nodo) Primeiro e atual métodos cria lista ( ) /* cria célula cabeça e inicializa */ próximo ( ) /*vai para o próximo elemento da lista */ insere ( ) /* insere um elemento na posição atual */ deleta ( ) /* apaga posição atual */ volta ao começo ( ) /* atual = primeiro */ ... Podemos notar que um objeto é composto por estrutura e processos, onde esses processos giram em torno da estrutura, ao contrário das linguagens funcionais, nas quais a estrutura se adapta a função. Um objeto só pode ser manipulado por sua estrutura e seus métodos, nada mais do que isso. Somente um objeto de um determinado tipo pode acessar seus métodos e estrutura, um outro tipo de objeto não tem nenhum acesso a estes. Por exemplo, em uma classe cachorro temos o método fala. Se por exemplo definirmos um objeto da classe gato, este objeto não tem acesso nenhum ao método fala de cachorro. Dentro de um objeto, alguns métodos e/ou estrutura podem ser privados ao objeto, o que nos diz que são inacessíveis diretamente para qualquer elemento fora dele, o que impede que outros objetos tenham acesso direto às partes privadas do objeto referenciado. Para o objeto poder referenciar seus elementos privados ele deve passar pelos seus métodos, neste caso um método específico que faça a operação desejada, ou seja, ele pode acessar sua estrutura privada somente através de seus métodos, dando assim uma certa abstração de como é feita a manipulação da estrutura. Isso consiste no encapsulamento de dados que será explicado na seção referente a este tema. A princípio toda a estrutura deve ser privada, mas algumas linguagens como C++ permitem que a estrutura de um objeto possa ser acessada diretamente por outros objetos. Já em SmallTalk toda a estrutura é privada. Dessa maneira, um objeto evita significativamente que algumas outras partes não relacionadas de programa modifiquem ou usem incorretamente as partes privadas do objeto referenciado, dando assim maior confiabilidade na manipulação do objeto. Isso tudo nos mostra uma característica muito grande para construção de módulos independentes e abstração ao usuário. Mais exatamente, cada objeto é uma instância de sua classe. É a classe que contém a descrição da representação interna e dos métodos comuns a todas as suas instâncias (objetos). Cada instância da classe, por sua vez, possui sua própria memória privativa (seu estado interno) onde ficam armazenados os valores de seus componentes, que representam suas características individuais. 1.2.1 Criação de um objeto <Nome da classe><Nome do objeto> = new <construtor> Aluno a1 = new Aluno() 1.3 Atributos É o nome dado aos "campos" da classe, ou seja variáveis declaradas membros da classe. Sua visibilidade deve ser, em geral, privada ou protegida, ocultando assim a estrutura dos dados da classe das partes do programa que utilizam objetos da classe. public class Aluno { string nome; double nota1, nota2; } 1.4 Métodos É o nome das funções declaradas dentro da classe que irão manipular ou gerar resultados a partir dos atributos da classe. As funções podem manipular livremente com quaisquer atributos da classe. Os atributos da classe pai(veja herança) somente podem ser acessados se forem atributos protegidos. Os métodos são invocados a partir de uma variável do tipo da classe. 1.4.1 Declaração <Objeto da classe>.<Método>; Exemplo: public double Media() { return ((nota1+nota2)/2; } static void Main(void) { double x; Aluno a1 = new Aluno(); a1.Iniciar(5.7,8.7); x = a1.Media(); Aluno a2 = new Aluno(); a2.Iniciar(3.4,8.9); x = a2.Media(); } 1.4.2 Construtores Os construtores são um "conforto" fornecido pela linguagem e pelo paradigma para que possamos "inicializar" nosso objeto da classe. Podemos notar que nos exemplos acima nos utilizamos métodos "iniciar" antes de começar a usar o objeto com a finalidade, neste caso, de inicializar seus parâmetros. A orientação objeto permite que criemos um método especial, denominado "construtor" que é chamado automaticamente pelo programa no momento da criação(ou declaração se preferir) do objeto. Em C++ O método deve simplesmente ter o mesmo nome da classe. Um classe pode ter muitos construtores, dependendo das formas de inicialização que desejarmos. Um construtor pode inclusive não ter parâmtros, sendo chamado de construtor default. Ele pode ser utilizado, por exemplo, somente para zerar o valor de atributos da classe. A única restrição é que quando criamos vetores de objetos, não podemos passar parâmetros para os construtores, somente serão chamados construtores sem parâmetros, ou default. Exemplos: Aluno a1; a1.Iniciar(5.7,8.7); Passa a ser... Aluno a1 = new Aluno(5.7,8.7) Exemplo de construtor default: Declaração: public class <Nome da classe> { public <Nome da classe>(parâmetros) { Inicialização de atributos, Alocar memória,abrir arquivos, mensagens de tela,etc... { } 2 Herança A herança é o mecanismo que permite a reutilização dos métodos e atributos implementados numa classe numa outra. A classe que "herda" os métodos e atributos é chamada também de classe filha e a classe da qual ela herda é chamada de classe pai. Tomando como exemplo um cálculo de imposto de renda, existem vários cálculos que podem ser feitos tanto para pessoa física quanto para pessoa jurídica. Podemos definir uma classe pessoa criar classes pessoa jurídica ou pessoa física como heranças de pessoa. Todos os métodos declarados para a classe pessoa passam a pertencer também a pessoa física e juridica. 2.1 Declaração A herança pode ser pública ou privada, se ela for pública (veja a declaração [public] abaixo, significa que os métodos que eram públicos na classe pai também o são na classe filha, no caso contrário, a classe filha pode acessar os métodos da classe pai dentro de seus métodos mas um "usuário" ou alguem usando um objeto da class filha não poderia acessar os métodos da classe pai. Exemplo: class Aluno{ string nome; protected double nota1,nota2; } class AlunoFaculdade:Aluno { string ProjetoFinal; double NotaPF; public void AlteraNome(string n); public double CalculaNota(); } 2.3 Visibilidade: protected A principio, uma classe filho não pode ler ou alterar os valores dos atributos da sua classe pai se eles forem privados. Para que isso seja possível é necessário declara- los como protegidos. A razão disso também é a integração e divisão de projeto. Existem casos onde uma equipe vai desenvolver as classes pai e a outra é que vai desenvolver as filhas. Desta forma, os atributos só poderão ser acessados nas classes filhas através dos métodos da classe pai. 3 Associações Uma associação é quando uma classe está ligada ou contém objetos de outras classes. Suponha, por exemplo, que uma classe Automóvel contenha dentro dela uma classe Proprietário. Dentro de um sistema grande a classe proprietário pode ser utilizada tanto para o automóvel quanto para uma Casa, por exemplo. As associações podem ser de 1 para 1, de 1 para muitos ou de muitos para muitos. Uma ligação de 1 para 1 seria a citada acima, de automóvel-proprietário. Uma associação de 1 para muitos é quando uma classe possui uma lista de objetos de uma outra classe. Uma classe Avião, por exemplo, poderia conter uma lista(ou vetor) de objetos da classe Passageiro. Existem várias formas de associação: 3.1 Agregação É quando a classe "possui" realmente os objetos que agrega. Na prática, a classe agregadora passa a ficar responsável pela criação e destruição destes objetos. Suponha que você crie dinâmicamente vários objetos da classe Aluno e agregue numa classe Escola. O destrutor destaclasse tem que se encarregar de "deletar" todos os objetos da classe Aluno criados. 3.2 Agregação por Composição Este tipo de agregação é usado quando usamos criação estática dos objetos que serão agregados. A diferença é que nesse caso, os objetos serão criados no mesmo momento que o objeto da classe agregadora, enquanto que a agregação "comum" a criação é dinâmica é feita após a criaçao da classe agregadora. 3.3 Associação As Associações, chamadas simplesmente assim, são na prática referências de uma classe para objetos de outra classe. Neste caso sempre utilizamos ponteiros ou listas encadeadas de ponteiros, etc. As classes que referenciam umas as outras não tem responsabilidade sobre si, ou seja, não são elas que criam os objetos e nem as responsáveis pela sua destruição. 4 Polimorfismo O polimorfismo é a característica mais complexa e ao mesmo tempo a mais poderosa da Orientação por Objetos. Ela permite que tratemos várias classes diferentes de uma forma generalizada, como se ela fosse uma mesma classe. O processo consiste em criar várias heranças de uma mesma classe e tratar todos os objetos das classe-filhas como se elas fossem da classe pai. Tomemos como exemplo uma classe Janela do windows. Ao desejarmos criar um novo tipo de janela específica, do tipo WORD, por exemplo, fazemos uma herança da classe Janela. Prosseguindo, poderíamos criar heranças de Janela para cada tipo de aplicação que estivéssemos desenvolvendo. Bem, como o Windows faria para gerenciar o desenho de tantos tipos de Janelas, algumas que ainda nem foram criadas? O segredo está no poliforfismo. A classe Janela inicial contém alguns métodos chamados de Métodos Virtuais, que não fazem nada mas servem como um padrão para todas as filhas da classe Janela. Quando criamos uma herança da classe Janela, devemos obrigatóriamente redefinir os métodos Virtuais adequando-os para o nosso tipo de janela. Se criarmos, por exemplo, uma JanelaImagem, redefinimos o método Desenha da Janela Pai para que ele, no caso da classe JanelaImagem, desenhe uma imagem desejada. O que o Windows faz, após isto, é guardar uma lista de Janelas e tratá-las como se elas fossem apenas Janela, ignorando suas heranças. Quando o Windows tem que redesenhar as janelas ele vai em todas elas e chama o método virtual Desenha. O sistema automáticamente verifica qual a herança que realmente está ali e chama o método da classe filha adequado.
Compartilhar