TÉCNICAS DE ORIENTAÇÃO A OBJETOS APLICAÇÃO EM: C# E JAVA Sumário INTRODUÇÃO............................................................................................................................ 4 PARADIGMAS DE PROGRAMAÇÃO ............................................................................................ 5 PROGRAMAÇÃO PROCEDURAL.............................................................................................. 5 PROGRAMAÇÃO ESTRUTURADA ............................................................................................ 5 PROGRAMAÇÃO ORIENTADA A OBJETOS............................................................................... 5 CLASSE ...................................................................................................................................... 6 O QUE É UMA CLASSE?.......................................................................................................... 6 TIPO DE ATRIBUTOS .............................................................................................................. 6 TIPOS DE MÉTODOS .............................................................................................................. 6 MODIFICADORES DE ACESSO ................................................................................................ 7 MÉTODO CONSTRUTOR ........................................................................................................ 8 OBJETO ................................................................................................................................. 8 APLICANDO ORIENTAÇÃO A OBJETOS EM LINGUAGEM C# .................................................. 10 INSTANCIADO E PASSANDO VALORES.................................................................................. 12 APLICANDO ORIENTAÇÃO A OBJETOS EM LINGUAGEM JAVA .............................................. 13 INSTANCIADO E PASSANDO VALORES.................................................................................. 14 HERANÇA ................................................................................................................................ 15 HERANÇA MÚLTIPLA ........................................................................................................... 16 APLICAÇÃO DE HERANÇA EM C# ......................................................................................... 17 INSTANCIANDO AS CLASSES ................................................................................................ 20 APLICAÇÃO EM JAVA ........................................................................................................... 22 ABSTRAÇÃO ............................................................................................................................ 28 CLASSES E MÉTODOS ABSTRATOS. ...................................................................................... 28 APLICAÇÃO DE ABSTRAÇÃO EM C# ...................................................................................... 30 APLICAÇÃO EM JAVA ........................................................................................................... 35 ENCAPSULAMENTO ................................................................................................................ 40 ATRIBUTOS PRIVADOS......................................................................................................... 40 MÉTODOS GET E SET ........................................................................................................... 40 APLICAÇÃO DO ENCAPSULAMENTO EM C# ......................................................................... 42 MÉTODO DE ENCAPSULAMENTO 3...................................................................................... 58 APLICAÇÃO EM JAVA ........................................................................................................... 64 POLIMORFISMO ...................................................................................................................... 72 SOBRESCRITA DE MÉTODOS ................................................................................................ 72 SOBRECARGA DE MÉTODOS ................................................................................................ 73 APLICAÇÃO DO POLIMORFISMO EM C# ............................................................................... 74 APLICAÇÃO EM JAVA ........................................................................................................... 77 INTERFACES ............................................................................................................................ 80 APLICAÇÃO DE INTERFACES EM C# ...................................................................................... 81 APLICAÇÃO EM JAVA ........................................................................................................... 82 CLASSES E MÉTODOS ESTÁTICOS ............................................................................................. 83 CLASSE ESTÁTICA ................................................................................................................ 83 MÉTODOS ESTÁTICOS ......................................................................................................... 83 APLICAÇÃO DE CLASSES ESTÁTICAS EM C# .......................................................................... 84 APLICAÇÃO EM JAVA ........................................................................................................... 85 RELAÇÃO DE OBJETOS ............................................................................................................. 86 ASSOCIAÇÃO ....................................................................................................................... 86 ASSOCIAÇÃO SIMPLES ......................................................................................................... 86 AGREGAÇÃO ....................................................................................................................... 87 COMPOSIÇÃO ..................................................................................................................... 87 DEPENDÊNCIA ..................................................................................................................... 87 GENERALIZAÇÃO ................................................................................................................. 88 APLICAÇÃO DE RELAÇÃO ENTRE OBJETOS EM C# ................................................................ 89 APLICAÇÃO EM JAVA ........................................................................................................... 93 EXCEÇÕES ............................................................................................................................... 99 TRY, CATCH E FINALLY. ........................................................................................................ 99 APLICAÇÃO DE TRATAMENTO DE EXCEÇÕES EM C# ........................................................... 101 APLICAÇÃO EM JAVA ......................................................................................................... 102 INTRODUÇÃO Nesta apostila vamos conhecer tudo que é necessário para começar a desenvolver softwares orientados a objetos! A seguir você vai conhecer os conceitos teóricos usando diagramas e práticos usando duas ótimas linguagens de programação que são Java e C#. PARADIGMAS DE PROGRAMAÇÃO Para o inicio dos nossos estudos devemos saber o que é um paradigma de programação! E nada mais é do que uma forma de determinar a estrutura e execução de um programa e temos vários tipos de paradigmas vindo do procedural, passando pelo estruturado e chegando ao orientado a objetos. Veja a seguir um pouco mais detalhadamente os paradigmas de programação. PROGRAMAÇÃO PROCEDURAL Este paradigma é antigo porém ainda usado em linguagens como Cobol (usada em aplicações gigantescas) com foco principal em instituições financeiras e pascal (para ensinar lógica de programação). Este paradigma consiste em chamadas de procedimentos, rotinas e sub-rotinas, métodos ou funções que forma uma sequencia de passos a serem executados. PROGRAMAÇÃO ESTRUTURADA A programação estruturada era a mais usada antes de surgir a orientação a objetos. Na programação estruturada o código é sequencial usando decisões e chamadas de repetição criando um código em que o computador interpreta de forma sequencial usado em varias linguagem como, por exemplo, C. PROGRAMAÇÃO ORIENTADA A OBJETOS Agora chegamos em nosso ponto inicial! Vamos conhecer o que é a orientação a objetos. É um paradigma baseado na criação de classes que se possuem características e comportamentos que quando instanciados são criados os objetos! Vamos a seguir aprender detalhadamente esse paradigma de programação! CLASSE O QUE É UMA CLASSE? A primeira que devemos conhecer na orientação a objetos é uma classe. A orientação a objetos basicamente é um conjunto de classes que possuem métodos e atributos e se relacionam. Então uma classe é como um projeto de um objeto pois um objeto sempre é criado através de uma classe. As classes possuem atributos que são suas características e métodos que são suas ações. Nome da Classe Atributos Métodos TIPO DE ATRIBUTOS Os atributos guardam informações para a classe que podem ser usadas pelos métodos para realizar suas tarefas. Esses atributos possuem diversos tipos como pro exemplo: String, int, double, float, ou seja, os tipos de dados que a linguagem que for utilizar possua. Na figura acima temos o atributo nome que é do tipo string que é um conteúdo de texto, porém a idade é do tipo int que recebe apenas números inteiros. TIPOS DE MÉTODOS Como os atributos os métodos também possuem seus tipos, todos os métodos do nosso exemplo são do tipo void e isso significa que ele não tem valor de retorno, ou seja, não seu final ele executa uma ação mais não passa nenhum valor. Porém podemos ter métodos do tipos String que vai retornar uma string(texto) ao final da sua execução. Os métodos retornam o valor do tipo declarado na sua criação se você criar um método do tipo int ele vai retornar um numero inteiro, se for do tipo bool vai retornar um booleano (true/false) e assim por diante. MODIFICADORES DE ACESSO Todos os atributos, e métodos possuem níveis de modificadores de acesso que são public, protected e private. Public (publico) = método ou atributo publico, significa que todas as classes podem acessar e modificar o seu valor no caso de um atributo e executar se for um método. No digrama de classes é representado com o símbolo de soma (+). Protected (protegido) = neste caso os métodos e atributos estão protegidos e só podem ser acessados na classe a qual eles pertencem e nas classes que herdam dela. Ainda vamos aprender mais sobre herança! No digrama de classes é representado com o símbolo de sustenido (jogo da velha ou hashtag) (# ). Private (privado) = como privado os métodos e atributos são acessados apenas na classe onde foram criados. No digrama de classes é representado com o símbolo de subtração (-). Atributo privado Atributo publico Método publico Atributo protegido Método privado Método protegido Por padrão na orientação a objetos os atributos são privados e os métodos públicos porém mais adiante vamos compreender tudo isso melhor. Os método podem receber parâmetros que são valores a ser passados para o método que os utiliza para realizar suas ações. Esse métodos podem ser de vários tipos ex: string, int bool ... Parâmetros MÉTODO CONSTRUTOR Um método construtor é executado na criação do objeto e também obriga a passar suas propriedades no momento que é feita a criação do objeto. Uma característica marcante de um método construtor é que sua assinatura (nome) é o mesmo da classe que ele pertence. Método Construtor OBJETO Um objeto é o resultado de uma classe instanciada. Com isso uma classe pode gerar diversos tipos de objetos diferentes onde seus atributos possuem valores diferentes tendo características próprias, porém a estrutura é a mesma mantendo inclusive as mesmas ações já determinadas na classe (métodos). Nome: João Sobrenome: Costa Idade: 50 Peso: 76 Cor: Branco Correr Beber Enxergar Ouvir Nome: Jose Sobrenome: Silva Idade: 30 Peso: 96 Cor: Pardo Correr Beber Enxergar Ouvir Acima podemos conferir um exemplo onde temos uma classe Pessoa e com base nesta classe criamos 2 objetos João e José onde ambos possuem a mesma estrutura porém os valores dos atributos são diferentes criando a representação de duas pessoas diferentes. Agora vamos aplicar nas linguagens de programação Java e C#. APLICANDO ORIENTAÇÃO A OBJETOS EM LINGUAGEM C# Este é um exemplo da classe exibida no capitulo anterior porém os métodos estão sem o conteúdo . PARTE 2 Agora alteramos os atributos para publico para facilitar o exemplo da instanciação que vamos fazer a seguir. Também criamos o conteúdo dos métodos. INSTANCIADO E PASSANDO VALORES Neste exemplo estamos instanciando a classe pessoa e criando o objeto p passamos valores através de seus atributos, chamamos deus métodos. APLICANDO ORIENTAÇÃO A OBJETOS EM LINGUAGEM JAVA INSTANCIADO E PASSANDO VALORES HERANÇA Acredito que você já tenha ouvido falar em herança. E sabe que um filho herda coisas que sei pai deixou. Ai me pergunta. O que isso tem haver com orientação a objetos? A Resposta é: Tudo! A herança é um dos grandes pilares da programação orientada a objetos onde temos a presença de uma superclasse (também conhecida como classe pai ou classe mãe) que passa atributos e métodos para a classe de nível mais baixo a subclasse (também conhecida como classe filha). Com isso temos a reutilização de código porque com a herança podemos criar um método que faça uma determinada ação e todas as classes que herdar da classe onde ele foi criado já recebe essa função. Na imagem acima podemos notar que a classe pessoas possui os métodos e atributos necessários para criar um objeto pessoa, porém necessitamos ser mais específicos e em nosso sistema teremos a classe funcionário que é uma pessoa, porém como funcionário tem algumas funções a mais, com isso a classe funcionário herda os métodos e atributos da classe pessoa e implementa seus próprio métodos e atributos. E da mesma forma funciona as classes Fornecedor e Cliente. Abaixo veja mais um tipo de herança onde teremos a classe gerente que nada mais é do que um funcionário que possui mais funções, portanto ele pode fazer tudo o que uma pessoa e um funcionário somando ainda as suas funções especificas. Lembrando que muitas pessoas confunde isso com herança múltipla, mas não é herança múltipla veremos no próximo tópico deste capitulo. HERANÇA MÚLTIPLA Herança múltipla é quando uma classe recebe a herança de duas ou mais classes ao mesmo tempo. A herança múltipla não existe em varias linguagens de programação como, por exemplo, Java e C# que estamos estudando. APLICAÇÃO DE HERANÇA EM C# CLASSE FUNCIONÁRIO Esta é a classe funcionário com seus métodos implementados e passando a programação a sua herança da classe pessoa. Repare que tivemos de criar um método construtor na classe fornecedor, funcionário, cliente e gerente, porque coma criação de um construtor na classe base as herdeiras também deve ter um para isso criamos um construtor e pegamos o valor da base. CLASSE FORNECEDOR Esta é a classe fornecedor com seus métodos implementados e passando a programação a sua herança da classe pessoa. CLASSE CLIENTE Esta é a classe cliente com seus métodos implementados e passando a programação a sua herança da classe pessoa. GERENTE Esta é a classe Gerente com seus métodos implementados e passando a programação a sua herança da classe funcionário possuindo tudo que contem na classe pessoa e funcionário além de seus próprios métodos e atributos. INSTANCIANDO AS CLASSES FUNCIONÁRIO FORNECEDOR CLIENTE GERENTE APLICAÇÃO EM JAVA CLASSE FUNCIONÁRIO CLASSE FORNECEDOR CLASSE CLIENTE CLASSE GERENTE INSTANCIANDO AS CLASSES CLASSE FUNCIONARIO CLASSE FORNECEDOR CLASSE CLIENTE CLASSE GERENTE ABSTRAÇÃO A abstração é outro pilar importantíssimo da orientação a objetos, devemos sempre pensar do mais abstrato para o mais concreto. Observe a figura abaixo: Note que a classe pessoa já possui todos os métodos e atributos para criar um objeto pessoa, mas isso pode vago por isso definimos a classe funcionário que é uma pessoa, porém já é uma função mais especifica, sendo assim descobrimos que a classe pessoa é a superclasse da classe funcionário que por sua vez é a subclasse de pessoa. Assim como gerente é uma subclasse de funcionário, ou seja, gerente recebe os métodos e atributos de pessoa, funcionário e os seus. CLASSES E MÉTODOS ABSTRATOS. Uma classe quando abstrata fica com o papel de apenas servir de base para outras classes assim não pode ser instanciada e faz o importante papel de passar métodos e atributos que serão herdados pelas suas subclasses. Outra grande vantagem é que ela pode conter métodos abstratos que são métodos que possuem apenas sua assinatura (não implementados) assim obrigando que as classes herdeiras implemente esses métodos. No exemplo acima podemos ver que a classe pessoa virou abstrata porque o texto no nome da classe esta em italico assim como seus métodos que agora são abstratos obrigando as subclasses a implementas esses métodos e não sendo mais implementados na classe pessoa. Acima do nome da classe pessoa note que foi adicionado um estereotipo (stereotype) indicando que é uma classe abstrata isso é opcional usado apenas para facilitar o entendimento do diagrama. APLICAÇÃO DE ABSTRAÇÃO EM C# CRIANDO SUPER CLASSE ABSTRATA Agora nossa super classe é abstrata e seus métodos também são abstratos de forma que são implementados na classe Pessoa e sim nas classes herdeiras. CLASSE FUNCIONÁRIO CLASSE FORNECEDOR CLASSE CLIENTE CLASSE GERENTE APLICAÇÃO EM JAVA CLASSE PESSOA ABSTRATA CLASSE FUNCIONÁRIO CLASSE FORNECEDOR CLASSE CLIENTE CLASSE GERENTE ENCAPSULAMENTO Quando alguém te fala sobre encapsulamento certamente você deve imaginar que é algo dentro de uma capsula! E não esta totalmente errado. Encapsulamento em orientação a objetos consiste em isolar os atributos de uma classe não permitindo o acesso direto de outras partes do sistema permitindo assim que apenas a classe que é dona do atributo possa ter acesso. ATRIBUTOS PRIVADOS Seguindo as boas pratica da programação orientada a objetos os atributos de uma classe sempre devem ser privado assim deixar eles apenas acessíveis a classe onde foi criado. Agora você me pergunta se apenas a classe que o atributo pertence pode ter acesso a ele como vamos passar um valor ou pegar um valor dessa classe! E a resposta é simples. Através de métodos. MÉTODOS GET E SET Como foi dito ao aplicar os atributos como privados precisamos criar métodos para poder alterar o valor ou pegar o valor de um atributo. Os métodos usados são get e set. GET: Pegar o valor contido no atributo. SET: Altera o valor do atributo. Com esses métodos podemos controlar as alterações dos atributos e ainda podendo permitir apenas uma das ações caso necessário. Com essa pratica de tornar os atributos privados e usar os métodos para pegar e passar valor aos atributos temos o encapsulamento. Atributos privados Métodos Get e Set APLICAÇÃO DO ENCAPSULAMENTO EM C# MÉTODO DE ENCAPSULAMENTO 1 CLASSE PESSOA CLASSE FUNCIONÁRIO CLASSE FUNCIONÁRIO INSTANCIADA CLASSE FORNECEDOR CLASSE FORNECEDOR INSTANCIADA CLASSE CLIENTE CLASSE CLIENTE INSTANCIADA CLASSE GERENTE CLASSE GERENTE INSTANCIADA MÉTODO DE ENCAPSULAMENTO 2 CLASSE PESSOA CLASSE FUNCIONÁRIO CLASSE FUNCIONÁRIO INSTANCIADA CLASSE FORNECEDOR CLASSE FORNECEDOR INSTANCIADA CLASSE CLIENTE CLASSE CLIENTE INSTANCIADA CLASSE GERENTE CLASSE GERENTE INSTANCIADA MÉTODO DE ENCAPSULAMENTO 3 CLASSE PESSOA CLASSE FUNCIONÁRIO CLASSE FUNCIONÁRIO INSTANCIADA CLASSE FORNECEDOR CLASSE FORNECEDOR INSTANCIADA CLASSE CLIENTE CLASSE CLIENTE INSTANCIADA CLASSE GERENTE CLASSE GERENTE INSTANCIADA APLICAÇÃO EM JAVA CLASSE PESSOA CLASSE FUNCIONÁRIO CLASSE INSTANCIADA CLASSE FORNECEDOR CLASSE INSTANCIADA CLASSE CLIENTE CLASSE INSTANCIADA CLASSE GERENTE CLASSE INSTANCIADA POLIMORFISMO Polimorfismo (Varias formas) é a capacidade de objetos com origens iguais (heranças) realizar ações diferentes. Com o polimorfismo a orientação a objetos permite criar objetos vindos de classes semelhantes terem ações diferentes de acordo com sua necessidade especificas, ou seja, heranças parecidas mais comportamentos diferentes. SOBRESCRITA DE MÉTODOS A sobrescrita de métodos permite em uma classe herdeira reescrever a ação do método que herdou adaptando as suas necessidades. “Na sobrescrita o método é mantido com a mesma assinatura porém com alguma diferença na sua execução”. Método padrão Método Sobrescrito SOBRECARGA DE MÉTODOS A sobrecarga de métodos consiste em uma determinada classe possuir 2 ou mais métodos com a mesma assinatura(nome) porém cada um com uma ação, tipo e parâmetros diferentes. Essa sobrecarga também se aplica aos métodos construtores. Métodos Sobrecarregados Método Construtor Sobrecarregado APLICAÇÃO DO POLIMORFISMO EM C# SOBRESCRITA DE MÉTODO CLASSE FUNCIONÁRIO CLASSE GERENTE INSTANCIADOS AS CLASSES FUNCIONÁRIO GERENTE SOBRESCRITA DE MÉTODOS CLASSE FUNCIONÁRIO CLASSE INSTANCIADA APLICAÇÃO EM JAVA SOBRESCRITA DE MÉTODO CLASSE FUNCIONÁRIO CLASSE GERENTE INSTANCIADOS AS CLASSES FUNCIONÁRIO GERENTE SOBRESCRITA DE MÉTODOS CLASSE FUNCIONÁRIO CLASSE INSTANCIADA INTERFACES Depois de tudo que passamos você já deve imaginar que já viu tudo sobre orientação a objetos, porém ainda falta muito! O assunto agora é interface e não tem nada ligado à parte gráfica. As interfaces na orientação a objetos é uma forma de garantir que as classes implemente determinados métodos independente de onde esteja herdando. A interface funciona como um contrato onde a classe que o implementa deve por obrigação possuir todos os métodos conditos nela. Ao contrario da herança que varias linguagens não suporta a herança múltipla você pode implementar varias interface em uma mesma classe. Abaixo veja um diagrama de classes implementando a interface IEntradaSaida nas classes funcionário, gerente e cliente. Note que ela começa com “I” maiúsculo como convenção de nome para identificar que é uma interface inclusive colocando no diagrama o estereotipo <<interface>>. APLICAÇÃO DE INTERFACES EM C# INTERFACE INTERFACE IMPLEMENTADA NA CLASSE FUNCIONÁRIO INTERFACE IMPLEMENTADA NA CLASSE GERENTE INTERFACE IMPLEMENTADA NA CLASSE CLIENTE APLICAÇÃO EM JAVA INTERFACE INTERFACE IMPLEMENTADA NA CLASSE CLIENTE INTERFACE IMPLEMENTADA NA CLASSE GERENTE INTERFACE IMPLEMENTADA NA CLASSE FUNCIONÁRIO CLASSES E MÉTODOS ESTÁTICOS Agora vamos aprender sobre classes e métodos estáticos que facilitam a vida de todo programador criando recursos que podem ser usados sem a necessidade de instancia uma classe e criar um objeto. CLASSE ESTÁTICA A classe estática é uma classe como outra qualquer porém não pode ser instanciada e é utilizada como recipiente para os métodos estáticos. MÉTODOS ESTÁTICOS Os métodos e atributos estáticos podem estar presentes em classes estáticas ou em classes normais, porém para chamar um método ou atributo estático não é necessário instanciar uma classe e sim apenas informa a classe e depois o método/atributo tornando assim uma forma fácil de criar métodos que sempre devem ser usados em diferentes situações. APLICAÇÃO DE CLASSES ESTÁTICAS EM C# CLASSE ESTÁTICA UTILITÁRIO APLICAÇÃO NO PROGRAMA APLICAÇÃO EM JAVA CLASSE UTILITÁRIO APLICAÇÃO NO PROGRAMA RELAÇÃO DE OBJETOS Neste capitulo vamos falar sobre as formas em que as classes se relacionam, já vimos uma parte importante que é a herança e agora vamos ver outros tipos de relação. ASSOCIAÇÃO Toda ligação entre dois objetos é uma associação, porém temos vários tipos de associação como vamos acompanhar abaixo. ASSOCIAÇÃO SIMPLES Mostra que um objeto esta conectado ou contem outro. Todas as associações possuem Nome, navegabilidade, cardinalidade(multiplicidade). Cardinalidade Nome Navegabilidade AGREGAÇÃO É uma associação especial onde nesse relacionamento um objeto contem outro de forma que os dois tem igual importância e podem continuar existindo caso o um seja extinto. COMPOSIÇÃO A relação de composição funciona de forma parecida com a agregação porém um objeto é totalmente dependente do outro sendo que se o principal deixar de existir o outro também e extinto. DEPENDÊNCIA Na dependência um objeto depende das especificações do outro. GENERALIZAÇÃO A generalização basicamente é a herança. EXEMPLO DIAGRAMA COMPLETO APLICAÇÃO DE RELAÇÃO ENTRE OBJETOS EM C# CLASSE PESSOA CLASSE CLIENTE INTERFACE IDADOS CLASSE FILIAL CLASSE BANCO CRIANDO OBJETOS E EXECUTANDO MÉTODOS APLICAÇÃO EM JAVA CLASSE PESSOA CLASSE CLIENTE INTERFACE IDADOS CLASSE FILIAL CLASSE BANCO CRIANDO OBJETOS E EXECUTANDO MÉTODOS EXCEÇÕES Em todo software existem erros e nós como programadores tentamos ao máximo corrigir essas falhas fazendo com que não apareça para o usuário. Pense na seguinte situação quando você pede em um campo um valor numérico e o usuário digita uma letra é claro que na hora de uma ação como um calculo vai apresentar um erro isso é uma exceção e vai gerar uma mensagem que vai assustar o usuário, por isso vamos fazer um tratamento para essas exceções. TRY, CATCH E FINALLY. Para fazer esse tratamento de exceções usamos o bloco try, catch e finally presentes, por exemplo, nas linguagens Java e C#. Colocamos o código que vai ser monitorado dentro do try, as exceções dentro do catch e no finally a ação final que sempre será executada. Então se o código dentro do try tiver um exceção ativa o catch correspondente porque pode haver um ou mais catch cada um com uma exceção diferente, e se caso o try não conter exceção o catch não é executado já o finally é executado de qualquer forma pode ser usado por exemplo para fechar uma conexão com banco de dados. HIERARQUIA DAS CLASSES DE EXCEÇÃO DO .NET FRAMEWORK Fonte: http://www.devmedia.com.br HIERARQUIA DE HERANÇA DA CLASSE THROWABLE Fonte: http://www.devmedia.com.br APLICAÇÃO DE TRATAMENTO DE EXCEÇÕES EM C# MÉTODO PRINCIPAL DA CLASSE PROGRAM CLASSE ESTÁTICA CALCULO APLICAÇÃO EM JAVA CLASSE CALCULO MÉTODO PRINCIPAL DA CLASSE