Você está na página 1de 23

Programao Orientada a Objetos

Linguagens de Programaco I mleal@inf.puc-rio.br

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.

Linguagens de Programaco I mleal@inf.puc-rio.br

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).

Linguagens de Programaco I mleal@inf.puc-rio.br

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

Atributos, Mtodos e Mensagens


Um objeto composto por atributos e mtodos. O estado de um objeto representado por variveis denominadas atributos. Alteraes no estado de um objeto geralmente ocorrem atravs da invocao de seus mtodos. Mtodos so as rotinas que descrevem os possveis comportamentos ou aes de um objeto. Um mtodo de um objeto invocadodo atravs do envio, ao objeto, de uma mensagem apropriada
Linguagens de Programaco I mleal@inf.puc-rio.br 7

Interface (Protocolo)
Parte privada do objeto (viso interna)
Mtodos usados internamente e atributos

Parte compartilhada do objeto (interface ou protocolo)


Mtodos que podem ser invocados externamente Corresponde s mensagens que um objeto capaz de responder Especifica portanto um contrato quais as operaes que o objeto pode e deve realizar No contm qualquer informao sobre como as operaes devem ser executadas ou implementadas
Linguagens de Programaco I mleal@inf.puc-rio.br 8

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

Linguagens de Programaco I mleal@inf.puc-rio.br

12

Exemplo - Object Pascal


type Figura=class private BaseX,BaseY: integer; Visible: boolean; public constructor Cons(bx,by: integer); destructor Destroi; interface procedure Desenha(cor: integer); virtual; procedure Apaga; procedure Move(dx,dy: integer) end;

Linguagens de Programaco I mleal@inf.puc-rio.br

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

um objeto uma mensagem

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(); }

Linguagens de Programaco I mleal@inf.puc-rio.br

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.

Linguagens de Programaco I mleal@inf.puc-rio.br

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

class carro { Motor motor; Chassi chassi; ... }

atributos

Linguagens de Programaco I mleal@inf.puc-rio.br

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 ...

Veculo ... ... ...


Linguagens de Programaco I mleal@inf.puc-rio.br

28

Polimorfismo
Polimorfismo a capacidade de um objeto tomar diversas formas. polimorfismo

universal

adhoc

paramtrico

subtipo

sobrecarga

coero

Linguagens de Programaco I mleal@inf.puc-rio.br

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?()

Linguagens de Programaco I mleal@inf.puc-rio.br

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!

Linguagens de Programaco I mleal@inf.puc-rio.br

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

Linguagens de Programaco I mleal@inf.puc-rio.br

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

Mtodos Virtuais ou Abstratos


Quando apenas a assinatura de um mtodo declarada por uma classe este mtodo denominado virtual ou abstrato. Classes abstratas devem ter pelo menos um mtodo virtual. Em C++ apenas os mtodos declarados como virtuais so vinculados dinamicamente (late(latebinding). Em Java todos os mtodos so vinculados dinamicamente.
Linguagens de Programaco I mleal@inf.puc-rio.br 37

Late Binding em C++


Para implementar o late binding de mtodos, o compilador C++ cria uma tabela denominda VTABLE para todas as classes que contm mtodos virtuais. A VTABLE armazena o endereo dos mtodos virtuais. Adicionalmente, para todas as classes com mtodos virtuais criado um atributo denominado vpointer (VPTR) que aponta para a VTABLE do objeto. Quando um mtodo invocado, a VTABLE do objeto utilizada para descobrir o endereo do mtodo especvifo que deve ser executado.
Linguagens de Programaco I mleal@inf.puc-rio.br 38

Late Binding em C++


Animal a[0] = a[1] = a[2] = a[3]; new Gato(); new Cachorro(); new Galinha();

VTABLEs &Gato:: falar

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

Linguagens de Programaco I mleal@inf.puc-rio.br

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 ... }

Linguagens de Programaco I mleal@inf.puc-rio.br

43

Atributos de Classes e Mtodos Estticos


Em algumas LPs OO podepode-se definir atributos associados diretamente a uma classe. Os atributos de uma classe podem ser manipulados apenas por mtodos estticos mtodos que tambm so associados a uma classe. Atributos de classe so equivalentes a variveis globais de LPs no OO, e mtodos estticos equivalem a funes ordinrias.

Linguagens de Programaco I mleal@inf.puc-rio.br

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

Você também pode gostar