programação orientada a objetos histórico

23
Linguagens de Programacão I [email protected] 1 Programação Programação Orientada a Objetos Orientada a Objetos Linguagens de Programacão I [email protected] 2 Histórico Histórico O conceito de Classe foi introduzido na década de 60 O conceito de Classe foi introduzido na década de 60 através da LP Simula 67. através da LP Simula 67. A primeira LP OO pura foi Smalltalk desenvolvida A primeira LP OO pura foi Smalltalk desenvolvida durante a década de 70. durante a década de 70. Outros exemplos de LPs OO são Eiffel, Java, Object Outros exemplos de LPs OO são Eiffel, Java, Object Pascal e C#. Pascal e C#. LPs como C++, Ada e Perl suportam o conceito de LPs como C++, Ada e Perl suportam o conceito de classe mas não são consideradas LPs OO em um classe mas não são consideradas LPs OO em um sentido mais rigoroso. sentido mais rigoroso.

Upload: dangminh

Post on 09-Jan-2017

228 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Programação Orientada a Objetos Histórico

1

Linguagens de Programacão [email protected] 1

ProgramaçãoProgramaçãoOrientada a ObjetosOrientada a Objetos

Linguagens de Programacão [email protected] 2

HistóricoHistórico

O conceito de Classe foi introduzido na década de 60 O conceito de Classe foi introduzido na década de 60 através da LP Simula 67.através da LP Simula 67.

A primeira LP OO pura foi Smalltalk desenvolvida A primeira LP OO pura foi Smalltalk desenvolvida durante a década de 70. durante a década de 70.

Outros exemplos de LPs OO são Eiffel, Java, Object Outros exemplos de LPs OO são Eiffel, Java, Object Pascal e C#.Pascal e C#.

LPs como C++, Ada e Perl suportam o conceito de LPs como C++, Ada e Perl suportam o conceito de classe mas não são consideradas LPs OO em um classe mas não são consideradas LPs OO em um sentido mais rigoroso.sentido mais rigoroso.

Page 2: Programação Orientada a Objetos Histórico

2

Linguagens de Programacão [email protected] 3

IntroduçãoIntrodução

Com o desenvolvimento de aplicações de software Com o desenvolvimento de aplicações de software cada vez mais complexas, cresceram as demandas cada vez mais complexas, cresceram as demandas por metodologias que pudessem abstrair e por metodologias que pudessem abstrair e modularizar as estruturas básicas de programas.modularizar as estruturas básicas de programas.

A programação OO suporta a abstração e A programação OO suporta a abstração e mudularização através da especificação de tipos mudularização através da especificação de tipos abstratos de dados (as classe), e promove a abstratos de dados (as classe), e promove a reutilização de software por meio do mecanismos de reutilização de software por meio do mecanismos de herança.herança.

Linguagens de Programacão [email protected] 4

IntroduçãoIntroduçãoA programação OO busca modelar aplicações A programação OO busca modelar aplicações seguindo uma estrutura semelhante àquela seguindo uma estrutura semelhante àquela encontrada no mundo real.encontrada no mundo real.

O mundo é composto por objetos que apresentam O mundo é composto por objetos que apresentam estados e comportamentos.estados e comportamentos.

Um gato por exemplo tem um nome, uma cor e uma Um gato por exemplo tem um nome, uma cor e uma raça (os estados) e ele come, mia e caça ratos (os raça (os estados) e ele come, mia e caça ratos (os comportamentos).comportamentos).

Page 3: Programação Orientada a Objetos Histórico

3

Linguagens de Programacão [email protected] 5

Modelo OOModelo OOUma aplicação OO é composta por diferentes Uma aplicação OO é composta por diferentes objetos e uma sequência de ações (interações).objetos e uma sequência de ações (interações).

Uma ação se inicia através do envio de uma Uma ação se inicia através do envio de uma mensagem para um agente (um objeto) que será mensagem para um agente (um objeto) que será responsável por tratar essa ação.responsável por tratar essa ação.

A mensagem carrega uma requisição, além de toda A mensagem carrega uma requisição, além de toda a informação necessária (argumentos) para que a a informação necessária (argumentos) para que a ação seja executada.ação seja executada.

Se o agente receptor da mensagem a aceita, ele tem Se o agente receptor da mensagem a aceita, ele tem a responsabilidade de executar um método para a responsabilidade de executar um método para cumprir a requisição.cumprir a requisição.

Linguagens de Programacão [email protected] 6

ObjetosObjetos

Constituem as estruturas básicas de uma aplicação.Constituem as estruturas básicas de uma aplicação.

EstãoEstão preparados para cumprir um determinado preparados para cumprir um determinado conjunto de requisições.conjunto de requisições.

Recebem essas requisições através de mensagens.Recebem essas requisições através de mensagens.

Possuem a responsabilidade de executar um Possuem a responsabilidade de executar um método que cumpra a requisição.método que cumpra a requisição.

Possuem um Possuem um estadoestado representado por informações representado por informações internas.internas.

Page 4: Programação Orientada a Objetos Histórico

4

Linguagens de Programacão [email protected] 7

Atributos, Métodos e MensagensAtributos, Métodos e Mensagens

Um objeto é composto por atributos e métodos.Um objeto é composto por atributos e métodos.

O estado de um objeto é representado por variáveis O estado de um objeto é representado por variáveis denominadas atributos.denominadas atributos.

Alterações no estado de um objeto geralmente Alterações no estado de um objeto geralmente ocorrem através da invocação de seus métodos.ocorrem através da invocação de seus métodos.

Métodos são as rotinas que descrevem os possíveis Métodos são as rotinas que descrevem os possíveis comportamentos ou ações de um objeto.comportamentos ou ações de um objeto.

Um método de um objeto é invocadodo através do Um método de um objeto é invocadodo através do envio, ao objeto, de uma mensagem apropriadaenvio, ao objeto, de uma mensagem apropriada

Linguagens de Programacão [email protected] 8

Interface (Protocolo)Interface (Protocolo)Parte privada do objeto (visão interna)Parte privada do objeto (visão interna)

Métodos usados internamente e atributosMétodos usados internamente e atributos

Parte compartilhada do objeto (interface ou Parte compartilhada do objeto (interface ou protocolo)protocolo)

Métodos que podem ser invocados externamenteMétodos que podem ser invocados externamente

Corresponde às mensagens que um objeto é capaz de Corresponde às mensagens que um objeto é capaz de responderresponder

Especifica portanto um contrato Especifica portanto um contrato quais as operações que quais as operações que o objeto pode e deve realizaro objeto pode e deve realizar

Não contém qualquer informação sobre como as operações Não contém qualquer informação sobre como as operações devem ser executadas ou implementadasdevem ser executadas ou implementadas

Page 5: Programação Orientada a Objetos Histórico

5

Linguagens de Programacão [email protected] 9

EncapsulamentoEncapsulamentoPrincípioPrincípio aplicadoaplicado a a programaçãoprogramação OO OO visandovisandogarantirgarantir a a abstraçãoabstração dos dados (dos dados (escondeesconde osos detalhesdetalhesdada implementaçãoimplementação).).

Um Um objetoobjeto nãonão devedeve permitirpermitir queque nenhumnenhum outrooutroobjetoobjeto acesseacesse seusseus dados dados diretamentediretamente..

O O relacionamentorelacionamento entreentre objetosobjetos devedeve ocorrerocorrerpreferencialmentepreferencialmente a a partirpartir de de métodosmétodos públicospúblicos(interface).(interface).

CasoCaso hajahaja umauma mudançamudança nana implementaçãoimplementação dadaclasseclasse, o , o relacionamentorelacionamento entreentre osos objetosobjetos nãonão seráseráafetadoafetado..

Linguagens de Programacão [email protected] 10

ClassesClasses

Especificam que informações um objeto irá Especificam que informações um objeto irá armazenar (os atributos), e o conjunto de requisições armazenar (os atributos), e o conjunto de requisições que um objeto pode cumprir (os métodos).que um objeto pode cumprir (os métodos).

Encapsulam a implementação dos métodos.Encapsulam a implementação dos métodos.

Definem a interface de um objeto .Definem a interface de um objeto .

Objetos são Objetos são instânciasinstâncias de classes.de classes.

Classes podem ser compostas em hierarquias, Classes podem ser compostas em hierarquias, através de através de herançaherança..

Page 6: Programação Orientada a Objetos Histórico

6

Linguagens de Programacão [email protected] 11

Exemplo Exemplo -- JavaJavaclass Produto { class Produto {

private String nome;private String nome;private float preco;private float preco;......private void calcMargem(float p) (){private void calcMargem(float p) (){

......} } public String getNome(){public String getNome(){

......} } public void setNome(String n) (){public void setNome(String n) (){

......}}public float getPreco() (){public float getPreco() (){

......}}

}}

interfaceinterface

métodosmétodos

atributosatributos

Linguagens de Programacão [email protected] 12

FiguraFigura

PolígonoPolígono

RetânguloRetânguloTriânguloTriângulo

ElipseElipse

meu_triangulomeu_triangulo retangulo2retangulo2um objetoum objeto

uma classeuma classe

Page 7: Programação Orientada a Objetos Histórico

7

Linguagens de Programacão [email protected] 13

Exemplo Exemplo -- Object PascalObject Pascaltype Figura=classtype Figura=class

privateprivateBaseX,BaseY: integer;BaseX,BaseY: integer;Visible: boolean;Visible: boolean;

publicpublicconstructor Cons(bx,by: integer);constructor Cons(bx,by: integer);destructor Destroi;destructor Destroi;procedure Desenha(cor: integer); virtual;procedure Desenha(cor: integer); virtual;procedure Apaga; procedure Apaga; procedure Move(dx,dy: integer)procedure Move(dx,dy: integer)

end;end;

interfaceinterface

Linguagens de Programacão [email protected] 14

HerançaHerança

Permite a definição de classes específicas Permite a definição de classes específicas (subclasses) a partir de classes gerais (subclasses) a partir de classes gerais (superclasses).(superclasses).

Subclasses herdam todos os atributos e Subclasses herdam todos os atributos e métodos da superclasse.métodos da superclasse.

Subclasses podem declarar novos métodos e Subclasses podem declarar novos métodos e atributos ou mesmo redeclarar métodos atributos ou mesmo redeclarar métodos definidos pela superclasse (sobreescrever definidos pela superclasse (sobreescrever --overriding). overriding).

Page 8: Programação Orientada a Objetos Histórico

8

Linguagens de Programacão [email protected] 15

Exemplo Exemplo –– C++C++class Poligono {class Poligono {

protected:protected:int altura, largura;int altura, largura;

public:public:void set_valor (int a, int b)void set_valor (int a, int b)

{ largura=a; altura=b;}{ largura=a; altura=b;}};};

class Retangulo: public Poligono {class Retangulo: public Poligono {public:public:

int area (void)int area (void){ return (altura * largura); }{ return (altura * largura); }

};};

int main () {int main () {Retangulo ret;Retangulo ret;ret.set_valor(4,3);ret.set_valor(4,3);......

}}

um objeto

uma mensagem

Linguagens de Programacão [email protected] 16

HerançaHerançaQuando uma classe Quando uma classe BB herda de herda de AA, diz, diz--se que se que BB é uma é uma subsub--classeclasse de de AA, e , e AA é a é a superclasse de Bsuperclasse de B..

No exemplo anterior Retângulo é uma subclasse de Polígono, e No exemplo anterior Retângulo é uma subclasse de Polígono, e Polígono é a superclasse de Retângulo.Polígono é a superclasse de Retângulo.

Uma subclasse especializa uma superclasse quando redefine Uma subclasse especializa uma superclasse quando redefine métodos, sem ampliar sua interface.métodos, sem ampliar sua interface.

Uma subclasse estende uma superclasse quando amplia a sua Uma subclasse estende uma superclasse quando amplia a sua interface, declarando novos métodos, mas sem redefinir os interface, declarando novos métodos, mas sem redefinir os métodos herdados.métodos herdados.

Uma subclasse pode ao mesmo tempo estender e especializar Uma subclasse pode ao mesmo tempo estender e especializar uma superclasse.uma superclasse.

Page 9: Programação Orientada a Objetos Histórico

9

Linguagens de Programacão [email protected] 17

Herança de InterfaceHerança de InterfaceEm algumas LPs é possível distinguir entre herança Em algumas LPs é possível distinguir entre herança de implementação e herança de interface.de implementação e herança de interface.

Na herança de interface uma classe herda uma ou Na herança de interface uma classe herda uma ou mais interfaces.mais interfaces.

As interfaces estabelecem os métodos (e as As interfaces estabelecem os métodos (e as respectivas assinaturas) que devem ser respectivas assinaturas) que devem ser implementados pela classe, mas a implementação implementados pela classe, mas a implementação deve ser integralmente especificada pela subclasse.deve ser integralmente especificada pela subclasse.

A herança de implementação usualmente implica na A herança de implementação usualmente implica na herança de interface.herança de interface.

Linguagens de Programacão [email protected] 18

Exemplo Exemplo -- JavaJavapublic interface Relogio {

Date getData();Time getHora();void setData(Date d);void setHora(Time t);

}

public Class RelogioDigital implements Relogio{Date getData(){ ... }Time getHora(){ ... }void setData(Date d){ ... }void setHora(Time t){ ... }void setAlarme(int size){ ... }void Display(){ ... }...

}

uma interface

uma classe que herdae implementa a interface

Page 10: Programação Orientada a Objetos Histórico

10

Linguagens de Programacão [email protected] 19

Herança de InterfaceHerança de InterfaceA herança de interface é utilizada quando é preciso A herança de interface é utilizada quando é preciso garantir que uma determinada classe seja capaz de garantir que uma determinada classe seja capaz de tratar um conjunto particular de mensagens.tratar um conjunto particular de mensagens.

A implementação das mensagens é específica de A implementação das mensagens é específica de cada classe, e não faz sentido a reutilização de cada classe, e não faz sentido a reutilização de código.código.

Um exemplo comum é a interface Runnable:Um exemplo comum é a interface Runnable:interface Runnable {interface Runnable {

void run();void run();

}}

Linguagens de Programacão [email protected] 20

Herança MúltiplaHerança Múltipla

Em algumas situações pode ser Em algumas situações pode ser interessante definir uma classe a partir interessante definir uma classe a partir de propriedades de duas ou mais de propriedades de duas ou mais classes distintas.classes distintas.

Algumas LPs (C++, Eiffel, Smalltalk) Algumas LPs (C++, Eiffel, Smalltalk) suportam este tipo de estrutura através suportam este tipo de estrutura através do mecanismo de herança múltipla.do mecanismo de herança múltipla.

Page 11: Programação Orientada a Objetos Histórico

11

Linguagens de Programacão [email protected] 21

Exemplo Exemplo –– C++C++class square{int side;class square{int side;public:public:int area(){return side * side;}int area(){return side * side;}

};};

class color{class color{char *color_name;char *color_name;

public:public:char *get_color(){return color_name;}char *get_color(){return color_name;}

};};

class colored_square: public color, public square{class colored_square: public color, public square{};};

int main () {int main () {colored_square s; colored_square s; ......x = s.get_color();x = s.get_color();y = s.area();y = s.area();

}}

Linguagens de Programacão [email protected] 22

Anomalia de HerançaAnomalia de HerançaO mecanismo de herança múltipla introduz um problema O mecanismo de herança múltipla introduz um problema conhecido como anomalia de herança.conhecido como anomalia de herança.

O que acontence com a subclasse se duas superO que acontence com a subclasse se duas super--classes classes contém métodos com a mesma assinatura?contém métodos com a mesma assinatura?

Animais

Baleia

AquáticosMamíferos

Page 12: Programação Orientada a Objetos Histórico

12

Linguagens de Programacão [email protected] 23

RelacionamentosRelacionamentos

Uma aplicação OO é estruturada através da Uma aplicação OO é estruturada através da especificação de classes e objetos, e dos especificação de classes e objetos, e dos relacionamentos entre estes.relacionamentos entre estes.

A relação de herança por exemplo é usada para A relação de herança por exemplo é usada para obter o efeito de especialização entre classes . obter o efeito de especialização entre classes .

Caminhão é uma especialização de veículo. Caminhão é uma especialização de veículo.

A relação inversa de especialização é a A relação inversa de especialização é a generalização (veículo é uma generalização de generalização (veículo é uma generalização de caminhão).caminhão).

Linguagens de Programacão [email protected] 24

RelacionamentosRelacionamentos

Outros exemplos de relacionamento Outros exemplos de relacionamento entre classes são: entre classes são:

Composição ou agregação;Composição ou agregação;

Associação;Associação;

Uso.Uso.

Page 13: Programação Orientada a Objetos Histórico

13

Linguagens de Programacão [email protected] 25

ComposiçãoComposição

Neste caso podemos definir uma classe Neste caso podemos definir uma classe como sendo composta por objetos de como sendo composta por objetos de outras classes.outras classes.

Não é necessário nenhuma construção Não é necessário nenhuma construção especial para suportar composições, especial para suportar composições, basta declarar as classes componentes basta declarar as classes componentes como atributos da classe composta.como atributos da classe composta.

Linguagens de Programacão [email protected] 26

ExemploExemplo

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

}}

CarroCarro

ChassiChassiMotorMotor

atributosatributos

Page 14: Programação Orientada a Objetos Histórico

14

Linguagens de Programacão [email protected] 27

UsoUso

Ocorre quando as instâncias de uma classe usam os Ocorre quando as instâncias de uma classe usam os serviços oferecidos por instâncias de outra classe.serviços oferecidos por instâncias de outra classe.

No exemplo abaixo, Motorista usa os serviços No exemplo abaixo, Motorista usa os serviços acelera() e freia() de Veículo.acelera() e freia() de Veículo.

......motormotorcambiocambio......acelera()acelera()freia()freia()......

......dirigir()dirigir()......

MotoristaMotorista

VeiculoVeiculo

Linguagens de Programacão [email protected] 28

AssociaçãoAssociação

Ocorre quando um objeto faz referência a um objeto Ocorre quando um objeto faz referência a um objeto de outra classe.de outra classe.

No exemplo abaixo, um No exemplo abaixo, um MotoristaMotorista está associado a está associado a um um VeículoVeículo..

...nomeendereçoveículo...

Motorista

...

...

...

Veículo

Page 15: Programação Orientada a Objetos Histórico

15

Linguagens de Programacão [email protected] 29

PolimorfismoPolimorfismo

paramétrico subtipo coerçãosobrecarga

universal adhoc

polimorfismo

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

Linguagens de Programacão [email protected] 30

Coerção e SobrecargaCoerção e Sobrecarga

Em LPs com coerção um tipo pode ser transformado Em LPs com coerção um tipo pode ser transformado em outro dependendo do contextoem outro dependendo do contexto::int x =5; int x =5;

float y = 3.5*x;float y = 3.5*x;

No caso de sobrecarga, um mesmo nome denota No caso de sobrecarga, um mesmo nome denota funções diferentes também conforme o contexto:funções diferentes também conforme o contexto:String s = “João” + “Silva”;String s = “João” + “Silva”;

int x = 4 + 5;int x = 4 + 5;

Page 16: Programação Orientada a Objetos Histórico

16

Linguagens de Programacão [email protected] 31

Polimorfismo ParamétricoPolimorfismo ParamétricoO comportamento de uma estrutura qualquer depende de uma O comportamento de uma estrutura qualquer depende de uma parâmetro que indica o tipo de dado a ser tratadoparâmetro 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 Programacão [email protected] 32

Polimorfismo de SubtipoPolimorfismo de SubtipoEste é o polimorfismo mais comum em LPs OO, e é o tipo ao Este é o polimorfismo mais comum em LPs OO, e é o tipo ao qual geralmente nos referimos quando utilizamos o termo qual geralmente nos referimos quando utilizamos o termo polimorfismo.polimorfismo.

Quando declaramos uma variável como sendo de uma classe Quando declaramos uma variável como sendo de uma classe específica, ela pode conter instâncias de quaisquer subclasses específica, ela pode conter instâncias de quaisquer subclasses desta classe específica.desta classe específica.

Como a interpretação de uma mensagem é da responsabilidade Como a interpretação de uma mensagem é da responsabilidade do objeto que a recebe, uma mesma mensagem pode ser do objeto que a recebe, uma mesma mensagem pode ser interpretada de forma diferente dependendo do objeto que a interpretada de forma diferente dependendo do objeto que a recebe.recebe.

A definição do método que irá ser executado como resultado do A definição do método que irá ser executado como resultado do envio de uma mensagem geralmente só acontece em tempo de envio de uma mensagem geralmente só acontece em tempo de execução (execução (latelate--binding).binding).

Page 17: Programação Orientada a Objetos Histórico

17

Linguagens de Programacão [email protected] 33

ExemploExemploAnimal a;Animal a;a = new Cachorro(); a = new Cachorro(); a.falar(); a.falar(); au! au!au! au!a = new Gato();a = new Gato();a.falar(); a.falar(); miau! miau!miau! miau!a = new Galinha();a = new Galinha();a.falar(); a.falar(); cocoroccocorocóó!!

Linguagens de Programacão [email protected] 34

TypecastTypecast

Para acessar um método específico de uma Para acessar um método específico de uma subclasse é necessário fazer um typecast da subclasse é necessário fazer um typecast da variável declarada como da superclasse.variável declarada como da superclasse.

Exemplo:Exemplo:Animal a; Animal a; a = new Galinha();a = new Galinha();((Galinha)a).botar_ovo;((Galinha)a).botar_ovo;a = new Cachorro();a = new Cachorro();((Galinha)a).botar_ovo; ((Galinha)a).botar_ovo; erroerro

Page 18: Programação Orientada a Objetos Histórico

18

Linguagens de Programacão [email protected] 35

Na hierarquia abaixo, a classe Na hierarquia abaixo, a classe FiguraFigura existe apenas para dar origem às existe apenas para dar origem às classes classes PolígonoPolígono e e CírculoCírculo. Não podem ser criadas instâncias dessa . Não podem ser criadas instâncias dessa classe já que sua especificação é imcompleta.classe já que sua especificação é imcompleta.

Classes abstratas são classes para as quais não podem ser criadaClasses abstratas são classes para as quais não podem ser criadas s instâncias.instâncias.

Elas existem na hierarquia de classes apenas para definir a inteElas existem na hierarquia de classes apenas para definir a interface rface de subclasses.de subclasses.

Classes AbstratasClasses Abstratas

FiguraFigura

CírculoCírculoPolígonoPolígono

Linguagens de Programacão [email protected] 36

Exemplo Exemplo –– C++C++class Figura {class Figura {

public:public:virtual float get_area() = 0;virtual float get_area() = 0;virtual float get_perimetro = 0; virtual float get_perimetro = 0;

};};

class Circulo::Figura {class Circulo::Figura {public:public:

float get_area(){float get_area(){return 3.14*raio*raio;return 3.14*raio*raio;

}}float get_perimetro{float get_perimetro{

return 6,28*raio;return 6,28*raio;} }

};};

Page 19: Programação Orientada a Objetos Histórico

19

Linguagens de Programacão [email protected] 37

Métodos Virtuais ou AbstratosMétodos Virtuais ou Abstratos

Quando apenas a assinatura de um método é Quando apenas a assinatura de um método é declarada por uma classe este método é declarada por uma classe este método é denominado virtual ou abstrato. denominado virtual ou abstrato.

Classes abstratas devem ter pelo menos um método Classes abstratas devem ter pelo menos um método virtual.virtual.

Em C++ apenas os métodos declarados como Em C++ apenas os métodos declarados como virtuais são vinculados dinamicamente (latevirtuais são vinculados dinamicamente (late--binding).binding).

Em Java todos os métodos são vinculados Em Java todos os métodos são vinculados dinamicamente.dinamicamente.

Linguagens de Programacão [email protected] 38

Late Binding em C++Late Binding em C++Para implementar o late binding de métodos, o Para implementar o late binding de métodos, o compilador C++ cria uma tabela denominda VTABLE compilador C++ cria uma tabela denominda VTABLE para todas as classes que contém métodos virtuais.para todas as classes que contém métodos virtuais.

A VTABLE armazena o endereço dos métodos A VTABLE armazena o endereço dos métodos virtuais.virtuais.

Adicionalmente, para todas as classes com métodos Adicionalmente, para todas as classes com métodos virtuais é criado um atributo denominado vpointer virtuais é criado um atributo denominado vpointer (VPTR) que aponta para a VTABLE do objeto.(VPTR) que aponta para a VTABLE do objeto.

Quando um método é invocado, a VTABLE do objeto Quando um método é invocado, a VTABLE do objeto é utilizada para descobrir o endereço do método é utilizada para descobrir o endereço do método especívifo que deve ser executado. especívifo que deve ser executado.

Page 20: Programação Orientada a Objetos Histórico

20

Linguagens de Programacão [email protected] 39

Late Binding em C++Late Binding em C++Animal a[3];Animal a[3];

a[0] = new Gato();a[0] = new Gato();

a[1] = new Cachorro();a[1] = new Cachorro();

a[2] = new Galinha();a[2] = new Galinha();

vptr

instância de Gato

vptr

instância de Cachorro

vptr

instância de Galinha

array deAnimal

&Gato:: falar&Gato:: comer

&Cachorro:: falar&Cachorro:: comer

&Galinha:: falar&Galinha:: comer

VTABLEs

Linguagens de Programacão [email protected] 40

Construtores e DestrutoresConstrutores e Destrutores

A instanciação de um objeto usualmente A instanciação de um objeto usualmente acontece através da invocação de um acontece através da invocação de um método especial conhecido como construtor.método especial conhecido como construtor.

O construtor é responsável por inicializar O construtor é responsável por inicializar adequadamento o objeto.adequadamento o objeto.

Algumas LPs OO suportam também o Algumas LPs OO suportam também o conceito de destrutores, métodos que são conceito de destrutores, métodos que são executados antes de um objeto ser destruído executados antes de um objeto ser destruído (desalocado da memória).(desalocado da memória).

Page 21: Programação Orientada a Objetos Histórico

21

Linguagens de Programacão [email protected] 41

ExemploExemploclass Date {class Date {private:private:

int day;int day;int month;int month;int year;int year;

public:public:// Construtor// ConstrutorDate(int d, int m, int y) {Date(int d, int m, int y) {

set(d, m, y);set(d, m, y);}}// Destrutor// Destrutor~Date(){~Date(){......}}void set(int d, int m, int y);void set(int d, int m, int y);......

};};

Linguagens de Programacão [email protected] 42

Sobrecarga em LPs OOSobrecarga em LPs OO

Em programação OO é bastante comum a Em programação OO é bastante comum a definição de métodos sobrecarregados.definição de métodos sobrecarregados.

Um exemplo de aplicação é na definição de Um exemplo de aplicação é na definição de construtores.construtores.

O método associado a uma invocação pode O método associado a uma invocação pode ser determinado a partir da análise léxica ser determinado a partir da análise léxica (estática) do código (desde que não haja a (estática) do código (desde que não haja a possibilidade de polimorfismo). possibilidade de polimorfismo).

Page 22: Programação Orientada a Objetos Histórico

22

Linguagens de Programacão [email protected] 43

ExemploExemploclass Date {class Date {private:private:

int day, month, year;int day, month, year;public:public:

// Construtor 1// Construtor 1Date(int d, int m, int y) {Date(int d, int m, int y) {set(d, m, y);set(d, m, y);

}}// Construtor 2// Construtor 2Date() {Date() {set(1, 1, 2000);set(1, 1, 2000);

}}......

};};

int main () {int main () {Date d(); // Construtor 1Date d(); // Construtor 1......

}}

Linguagens de Programacão [email protected] 44

Atributos de Classes eAtributos de Classes eMétodos EstáticosMétodos Estáticos

Em algumas LPs OO podeEm algumas LPs OO pode--se definir atributos se definir atributos associados diretamente a uma classe.associados diretamente a uma classe.

Os atributos de uma classe podem ser manipulados Os atributos de uma classe podem ser manipulados apenas por métodos estáticos apenas por métodos estáticos métodos que métodos que também são associados a uma classe.também são associados a uma classe.

Atributos de classe são equivalentes a variáveis Atributos de classe são equivalentes a variáveis globais de LPs não OO, e métodos estáticos globais de LPs não OO, e métodos estáticos equivalem a funções ordinárias.equivalem a funções ordinárias.

Page 23: Programação Orientada a Objetos Histórico

23

Linguagens de Programacão [email protected] 45

ExemplosExemplospublic class Math{ public class Math{

private static double pi = 3.14;private static double pi = 3.14;public static double getPI(){public static double getPI(){

return pi;return pi;}}

}}

public class Teste{ public class Teste{ private static int instances = 0;private static int instances = 0;public Test(){public Test(){

++instances; ++instances; }}......

} }