Beruflich Dokumente
Kultur Dokumente
Histrico
O conceito de Classe foi introduzido na dcada de 60 atravs da LP Simula 67. A primeira LP OO pura foi Smalltalk desenvolvida durante a dcada de 70. Outros exemplos de LPs OO so Eiffel, Java, Object Pascal e C#. LPs como C++, Ada e Perl suportam o conceito de classe mas no so consideradas LPs OO em um sentido mais rigoroso.
Linguagens de Programaco I mleal@inf.puc-rio.br 2
Introduo
Com o desenvolvimento de aplicaes de software cada vez mais complexas, cresceram as demandas por metodologias que pudessem abstrair e modularizar as estruturas bsicas de programas. A programao OO suporta a abstrao e mudularizao atravs da especificao de tipos abstratos de dados (as classe), e promove a reutilizao de software por meio do mecanismos de herana.
Introduo
A programao OO busca modelar aplicaes seguindo uma estrutura semelhante quela encontrada no mundo real. O mundo composto por objetos que apresentam estados e comportamentos. Um gato por exemplo tem um nome, uma cor e uma raa (os estados) e ele come, mia e caa ratos (os comportamentos).
Modelo OO
Uma aplicao OO composta por diferentes objetos e uma sequncia de aes (interaes). Uma ao se inicia atravs do envio de uma mensagem para um agente (um objeto) que ser responsvel por tratar essa ao. A mensagem carrega uma requisio, alm de toda a informao necessria (argumentos) para que a ao seja executada. Se o agente receptor da mensagem a aceita, ele tem a responsabilidade de executar um mtodo para cumprir a requisio.
Linguagens de Programaco I mleal@inf.puc-rio.br 5
Objetos
Constituem as estruturas bsicas de uma aplicao. Esto preparados para cumprir um determinado conjunto de requisies. Recebem essas requisies atravs de mensagens. Possuem a responsabilidade de executar um mtodo que cumpra a requisio. Possuem um estado representado por informaes internas.
Linguagens de Programaco I mleal@inf.puc-rio.br 6
Interface (Protocolo)
Parte privada do objeto (viso interna)
Mtodos usados internamente e atributos
Encapsulamento
Princpio aplicado a programao OO visando garantir a abstrao dos dados (esconde (esconde os detalhes da implementao). implementao). Um objeto no deve permitir que nenhum outro objeto acesse seus dados diretamente. diretamente. O relacionamento entre objetos deve ocorrer preferencialmente a partir de mtodos pblicos (interface). Caso haja uma mudana na implementao da classe, classe, o relacionamento entre os objetos no ser afetado. afetado.
Linguagens de Programaco I mleal@inf.puc-rio.br 9
Classes
Especificam que informaes um objeto ir armazenar (os atributos), e o conjunto de requisies que um objeto pode cumprir (os mtodos). Encapsulam a implementao dos mtodos. Definem a interface de um objeto . Objetos so instncias de classes. Classes podem ser compostas em hierarquias, atravs de herana.
Linguagens de Programaco I mleal@inf.puc-rio.br 10
Exemplo - Java
atributos class Produto { private String nome; private float preco; ... private void calcMargem(float p) (){ ... } public String getNome(){ mtodos ... } public void setNome(String n) (){ ... } public float getPreco() (){ ... } }
Linguagens de Programaco I mleal@inf.puc-rio.br 11
interface
Figura
Polgono
Elipse
Tringulo
Retngulo
uma classe
meu_triangulo
retangulo2
um objeto
12
13
Herana
Permite a definio de classes especficas (subclasses) a partir de classes gerais (superclasses). Subclasses herdam todos os atributos e mtodos da superclasse. Subclasses podem declarar novos mtodos e atributos ou mesmo redeclarar mtodos definidos pela superclasse (sobreescrever overriding).
Linguagens de Programaco I mleal@inf.puc-rio.br 14
Exemplo C++
class Poligono { protected: int altura, largura; public: void set_valor (int a, int b) { largura=a; altura=b;} }; class Retangulo: public Poligono { public: int area (void) { return (altura * largura); } }; int main () { Retangulo ret; ret.set_valor(4,3); ... }
Linguagens de Programaco I mleal@inf.puc-rio.br
15
Herana
Quando uma classe B herda de A, dizdiz-se que B uma subsubclasse de A, e A a superclasse de B. No exemplo anterior Retngulo uma subclasse de Polgono, e Polgono a superclasse de Retngulo. Uma subclasse especializa uma superclasse quando redefine mtodos, sem ampliar sua interface. Uma subclasse estende uma superclasse quando amplia a sua interface, declarando novos mtodos, mas sem redefinir os mtodos herdados. Uma subclasse pode ao mesmo tempo estender e especializar uma superclasse.
Linguagens de Programaco I mleal@inf.puc-rio.br 16
Herana de Interface
Em algumas LPs possvel distinguir entre herana de implementao e herana de interface. Na herana de interface uma classe herda uma ou mais interfaces. As interfaces estabelecem os mtodos (e as respectivas assinaturas) que devem ser implementados pela classe, mas a implementao deve ser integralmente especificada pela subclasse. A herana de implementao usualmente implica na herana de interface.
Linguagens de Programaco I mleal@inf.puc-rio.br 17
Exemplo - Java
public interface Relogio { Date getData(); Time getHora(); void setData(Date d); void setHora(Time t); }
uma interface
public Class RelogioDigital implements Relogio{ Date getData(){ ... } Time getHora(){ ... } void setData(Date d){ ... } void setHora(Time t){ ... } uma classe que herda void setAlarme(int size){ ... } e implementa a interface void Display(){ ... } ... }
Linguagens de Programaco I mleal@inf.puc-rio.br
18
Herana de Interface
A herana de interface utilizada quando preciso garantir que uma determinada classe seja capaz de tratar um conjunto particular de mensagens. A implementao das mensagens especfica de cada classe, e no faz sentido a reutilizao de cdigo. Um exemplo comum a interface Runnable:
interface Runnable { void run(); }
Linguagens de Programaco I mleal@inf.puc-rio.br 19
Herana Mltipla
Em algumas situaes pode ser interessante definir uma classe a partir de propriedades de duas ou mais classes distintas. Algumas LPs (C++, Eiffel, Smalltalk) suportam este tipo de estrutura atravs do mecanismo de herana mltipla.
Linguagens de Programaco I mleal@inf.puc-rio.br 20
Exemplo C++
class square{int side; public: int area(){return side * side;} }; class color{ char *color_name; public: char *get_color(){return color_name;} }; class colored_square: public color, public square{ };
int main () { colored_square s; ... x = s.get_color(); y = s.area(); }
21
Anomalia de Herana
O mecanismo de herana mltipla introduz um problema conhecido como anomalia de herana. O que acontence com a subclasse se duas supersuper-classes contm mtodos com a mesma assinatura? Animais Mamferos Baleia
Linguagens de Programaco I mleal@inf.puc-rio.br 22
Aquticos
Relacionamentos
Uma aplicao OO estruturada atravs da especificao de classes e objetos, e dos relacionamentos entre estes. A relao de herana por exemplo usada para obter o efeito de especializao entre classes . Caminho uma especializao de veculo. A relao inversa de especializao a generalizao (veculo uma generalizao de caminho).
Linguagens de Programaco I mleal@inf.puc-rio.br 23
Relacionamentos
Outros exemplos de relacionamento entre classes so:
Composio ou agregao; Associao; Uso.
24
Composio
Neste caso podemos definir uma classe como sendo composta por objetos de outras classes. No necessrio nenhuma construo especial para suportar composies, basta declarar as classes componentes como atributos da classe composta.
Linguagens de Programaco I mleal@inf.puc-rio.br 25
Exemplo
Carro
Motor
Chassi
atributos
26
Uso
Ocorre quando as instncias de uma classe usam os servios oferecidos por instncias de outra classe. No exemplo abaixo, Motorista usa os servios acelera() e freia() de Veculo.
Veiculo Motorista ... dirigir() ... ... motor cambio ... acelera() freia() ...
Linguagens de Programaco I mleal@inf.puc-rio.br 27
Associao
Ocorre quando um objeto faz referncia a um objeto de outra classe. No exemplo abaixo, um Motorista est associado a um Veculo.
Motorista ... nome endereo veculo ...
28
Polimorfismo
Polimorfismo a capacidade de um objeto tomar diversas formas. polimorfismo
universal
adhoc
paramtrico
subtipo
sobrecarga
coero
29
Coero e Sobrecarga
Em LPs com coero um tipo pode ser transformado em outro dependendo do contexto:
int x =5; float y = 3.5*x;
No caso de sobrecarga, um mesmo nome denota funes diferentes tambm conforme o contexto:
String s = Joo + Silva; int x = 4 + 5;
Linguagens de Programaco I mleal@inf.puc-rio.br
30
Polimorfismo Paramtrico
O comportamento de uma estrutura qualquer depende de uma parmetro que indica o tipo de dado a ser tratado:
Class stack [T] variable lst : List[T] := new List[T] method push(x:T) returns nothing lst := lst.prepend(x) method pop() returns T variable tmp : T := lst.head() lst := lst.tail() return tmp method top() returns T return lst.head() method empty?() returns Boolean returns lst.empty?()
31
Polimorfismo de Subtipo
Este o polimorfismo mais comum em LPs OO, e o tipo ao qual geralmente nos referimos quando utilizamos o termo polimorfismo. Quando declaramos uma varivel como sendo de uma classe especfica, ela pode conter instncias de quaisquer subclasses desta classe especfica. Como a interpretao de uma mensagem da responsabilidade do objeto que a recebe, uma mesma mensagem pode ser interpretada de forma diferente dependendo do objeto que a recebe. A definio do mtodo que ir ser executado como resultado do envio de uma mensagem geralmente s acontece em tempo de execuo (latelate-binding).
Linguagens de Programaco I mleal@inf.puc-rio.br
32
Exemplo
Animal a; a = new Cachorro(); a.falar(); au! au! a = new Gato(); a.falar(); miau! miau! a = new Galinha(); a.falar(); cocoroc cocoroc!
33
Typecast
Para acessar um mtodo especfico de uma subclasse necessrio fazer um typecast da varivel declarada como da superclasse. Exemplo:
Animal a; a = new Galinha(); ((Galinha)a).botar_ovo; a = new Cachorro(); ((Galinha)a).botar_ovo;
erro
34
Classes Abstratas
Na hierarquia abaixo, a classe Figura existe apenas para dar origem s classes Polgono e Crculo. No podem ser criadas instncias dessa classe j que sua especificao imcompleta. Figura Polgono Crculo
Classes abstratas so classes para as quais no podem ser criadas criadas instncias. Elas existem na hierarquia de classes apenas para definir a interface interface de subclasses.
Linguagens de Programaco I mleal@inf.puc-rio.br
35
Exemplo C++
class Figura { public: virtual float get_area() = 0; virtual float get_perimetro = 0; }; class Circulo::Figura { public: float get_area(){ return 3.14*raio*raio; } float get_perimetro{ return 6,28*raio; } };
Linguagens de Programaco I mleal@inf.puc-rio.br 36
instncia de Gato array de Animal vptr instncia de Cachorro vptr instncia de Galinha vptr
&Gato:: comer &Cachorro:: falar &Cachorro:: comer &Galinha:: falar &Galinha:: comer
39
Construtores e Destrutores
A instanciao de um objeto usualmente acontece atravs da invocao de um mtodo especial conhecido como construtor. O construtor responsvel por inicializar adequadamento o objeto. Algumas LPs OO suportam tambm o conceito de destrutores, mtodos que so executados antes de um objeto ser destrudo (desalocado da memria).
Linguagens de Programaco I mleal@inf.puc-rio.br 40
Exemplo
class Date { private: int day; int month; int year; public: // Construtor Date(int d, int m, int y) { set(d, m, y); } // Destrutor ~Date(){ ... } void set(int d, int m, int y); ... };
Linguagens de Programaco I mleal@inf.puc-rio.br 41
Sobrecarga em LPs OO
Em programao OO bastante comum a definio de mtodos sobrecarregados. Um exemplo de aplicao na definio de construtores. O mtodo associado a uma invocao pode ser determinado a partir da anlise lxica (esttica) do cdigo (desde que no haja a possibilidade de polimorfismo).
Linguagens de Programaco I mleal@inf.puc-rio.br 42
Exemplo
class Date { private: int day, month, year; public: // Construtor 1 Date(int d, int m, int y) { set(d, m, y); } // Construtor 2 Date() { set(1, 1, 2000); } ... }; int main () { Date d(); // Construtor 1 ... }
43
44
Exemplos
public class Math{ private static double pi = 3.14; public static double getPI(){ return pi; } } public class Teste{ private static int instances = 0; public Test(){ ++instances; } ... }
Linguagens de Programaco I mleal@inf.puc-rio.br 45