Sei sulla pagina 1di 81

Heran ca Simples

Heran ca Simples
Heran ca (ou subclassing) e um mecanismo para derivar novas classes a partir de classes existentes atrav es de um processo de renamento Uma classe derivada herda a representa c ao de dados e opera co es de sua classe base, mas pode: 1. Adicionar novas opera c oes e estender a representa c ao
de dados

2. Redenir a implementa c ao de opera c oes existentes Uma superclasse (ou classe base) proporciona a funcionalidade que e comum a todas as subclasses (ou classes derivadas), enquanto que uma subclasse proporciona a funcionalidade adicional que especializa o seu comportamento.

M etodos Construtores e Heran ca


Os m etodos construtores s ao uma exce c ao ` a regra de heran ca, pois n ao s ao herdados pelas subclasses O construtor de uma classe tem que obrigatoriamente chamar um construtor de sua superclasse Em Java, a palavra reservada super signica minha superclasse e o m etodo super() signica o m etodo construtor da minha superclasse O construtor pode receber par ametros que s ao usados para inicializar atributos da superclasse

Exemplo de Heran ca
Documento autor :String dataDeChegada :Date << create >> + Documento ():Documento + imprimir ():void + editar ():void

Carta transporte :String << create >> + Carta ():Carta + anexar ():void hora :Time

Telegrama

<< create >> + Telegrama ():Telegrama + registrar ():void + pagar ():void

executa "super()", que equivale a "Documento()"

Deni c ao de Tipos
A hierarquia especica 3 tipos diferentes: Documento = {Documento(), imprimir(), editar()} Carta = {Carta(), imprimir(), editar(), anexar()} Telegrama = {Telegrama(), imprimir(), editar(), registrar(), pagar()} Cria ca o de um objeto do tipo Carta: Carta c1 = new Carta();

Instancia c ao de um Objeto
Documento

Carta << . instance_of >> c1:Carta Estado do objeto "c1" autor = "Joana" :String dataDeChegada = 05/10/2006 transporte = "Areo" :String + Carta ():Carta + imprimir ():void + editar ():void + anexar ():void :Date

Interface pblica do objeto "c1"

Deni c ao de Tipos
Cria ca o de um objeto do tipo Documento:
Documento

Documento c1 = . << newinstance_of Documento(); >>


d1:Documento Carta autor = Marcos :String dataDeChegada= 25/01/2006 + Documento ():Documento + imprimir ():void + editar ():void :Date

Visibilidade Privada (I)


em 3 atri O estado do objeto c1 do tipo Carta cont butos: autor, dataDeChegada, transporte Os atributos autor e dataDeChegada devem ser alterados apenas por opera co es da classe Documento (visibilidade privada)

Visibilidade Privada (II)


O atributo transporte deve ser alterado apenas por opera co es da classe Carta (visibilidade privada) As opera co es da classe Carta n ao enxergam os atributos privados da classe base e, portanto, ela n ao pode alter a-los diretamente A interface p ublica do tipo Carta e estabelecida pelas opera co es v alidas para o tipo Carta

Exemplo de Heran ca
ContaBancaria #saldo :double << create >> + ContaBancaria (sal:double ):ContaBancaria + devolverSaldo ():double + creditar (valor :double ):void + debitar (valor :double ):void

ContaDePoup indice :double << create >> + ContaDePoup (sal:double ,ind :double ):ContaDePoup + render ():void

Visibilidade Protegida (I)


class ContaBancaria { protected double saldo; // e se fosse private? public ContaBancaria(double sal){ saldo = sal; } public double devoldeSaldo(){ return saldo; } public void creditar(double valor){ saldo += valor; } public void debitar(double valor){ saldo -= valor; } } // fim da classe ContaBancaria

Visibilidade Protegida (II)


class ContaDePoup extends ContaBancaria{ private double indice; // indice de rendimento public ContaDePoup(double sal, double ind){ super(sal); indice = ind; } public void render(){//calcula e deposita o rendimento double i = indice * saldo; saldo = saldo + i; } } // fim da classe ContaDePoup

Visibilidade Protegida (III)


a alterando um atributo pri A classe ContaDePoup est vado denido pela classe base Isso somente e poss vel porque a visibilidade do atributo saldo e estabelecida como protegida na classe ContaBancaria O que acontece se alterarmos a visibilidade protegida de saldo para visibilidade privada?

Visibilidade Protegida (IV)


A implementa c ao do m etodo calcula( ) na classe ContaDePoup deve ser mudada. C odigo Modicado: public void render ( ) { double s = this.getSaldo( ); double i = indice * s; this.creditar(i); } A classe ContaDePoup agora n ao enxerga o atributo saldo diretamente. O seu acesso deve ser realizado via a interface p ublica da classe ContaBancaria.

Clientes por Heran ca X Clientes por Instancia c ao


Heran ca introduz dois tipos de clientes de uma classe: Clientes por Instancia c ao: os usu arios criam inst ancias da classe e manipulam-as atrav es de sua interface p ublica. Esses clientes s ao objetos Clientes por Heran ca: os usu arios s ao as pr oprias subclasses que herdam os m etodos e atributos da classe base. Esses clientes s ao classes

Clientes por Instancia c ao


ContaBancaria c1 = new ContaBancaria(); double a = c1.saldo; // erro: mesmo com visibilidade //protegida c1.render(); // erro: tipo ContaBancaria n~ ao tem essa // opera c~ ao ContaDePoup c2 = new ContaDePoup(); double b = c2.saldo; // erro double i = c2.indice; // erro c2.render(); // v alido c2.creditar(10); // v alido

Clientes por Heran ca


A classe ContaDePoup e cliente por heran ca e, portanto, tem acesso ` a parte p ublica e tamb em ` a parte protegida, mas n ao tem acesso ` a parte privada da classe base

Os Modicadores de Visibilidade (I)


ublica: qualquer categoria de cliente pode acessar, P manipular e invocar diretamente atributos e m etodos declarados como public Privada: qualquer categoria cliente n ao pode acessar, manipular e invocar diretamente atributos e m etodos declarados como private. Somente a pr opria classe que os declara tem acesso direto

Os Modicadores de Visibilidade (II)


Vis vel pela subclasse (protegida): se um atributo ou m etodo e protegido, somente os clientes por heran ca t em acesso a ele. Os clientes por instancia c ao continuam a enxergar somente os atributos e m etodos com visibilidade p ublica Vis vel no m odulo (visibilidade de pacote): se um atributo ou m etodo possui visibilidade de pacote, somente os clientes que pertencerem ao mesmo m odulo (pacote) podem acess a-lo diretamente. Os clientes externos continuam a enxergar somente os atributos e m etodos com visibilidade p ublica

Nota c ao UML para Visibilidade


e representado antes do O modicador de visibilidade atributo ou opera c ao. Existem quatro modicadores: + p ublica - privada
Classe atributo1:TipoAtrib1 #atributo2:TipoAtrib2 ~atributo3:TipoAtrib3 operao pblica operao protegida operao privada operao com visibilidade de pacote +operacao1():TipoResposta #operacao2():TipoResposta operacao3():TipoResposta ~operacao4():TipoResposta atributo privado atributo protegido atributo com visibilidade de pacote

# protegida vis vel no pacote

Implementa c ao de Agrega c ao (I)


c ao e materializado O relacionamento de agrega atrav es de atributos; A classe agregadora cont em atributos que s ao refer encias para objetos agregados; A classe agregadora tamb em pode conter um atributo que referencia o objeto agregador.

Implementa c ao de Agrega c ao (II)


Carro cor:String +ligar():void +andar():void

5 Lataria Roda

3 Banco Motor

Implementa c ao de Agrega c ao (III)


Implementao da classe Carro

Carro cor :String lataria :Lataria bancoTraseiro :Banco bancoMotorista :Banco bancoPassageiro :Banco motor :Motor rodaFrontalEsquerda :Roda rodaFrontalDireita :Roda rodaTraseiraEsquerda :Roda rodaTraseiraDireita :Roda + ligar ():void + andar ():void Propriedade

Atributos

Atributos que guardam referncias para as partes

Lataria

Roda

Banco

Motor

+ ligar ():void + acelerar ():void

Implementa c ao de Agrega c ao (IV)


public class Carro { private Lataria lataria; private Banco bancoTraseiro; private Banco bancoMotorista; private Banco bancoPassageiro; private Motor motor; private Roda rodaFrontalEsquerda; private Roda rodaFrontalDireita; private Roda rodaTraseiraEsquerda; private Roda rodaTraseiraDireita; ...

Implementa c ao de Agrega c ao (V)


public Carro(String cor) { this.cor = cor; lataria = new Lataria(); bancoTraseiro = new Banco(); bancoMotorista = new Banco(); bancoPassageiro = new Banco(); motor = new Motor(); rodaFrontalEsquerda = new Roda(); rodaFrontalDireita = new Roda(); rodaTraseiraEsquerda = new Roda(); rodaTraseiraDireita = new Roda(); }//fim do construtor ...

Implementa c ao de Agrega c ao (VI)


public void ligar() { motor.ligar(); }//fim do m etodo ligar public void andar() { motor.acelerar(); }//fim do m etodo andar }//fim da classe Carro

Usos de Heran ca
O mecanismo de heran ca permite a constru c ao de duas categorias de hierarquias: Hierarquias de implementa c ao Hierarquias de comportamento

Hierarquias de Implementa c ao
ca e usada como uma t ecnica para implementar Heran TADs que s ao similares a outros j a existentes (reutiliza c ao de c odigo) Nesse caso, o programador usa heran ca como uma t ecnica de implementa c ao, com nenhuma inten c ao de garantir que a subclasse tenha o mesmo comportamento da superclasse Voc e pode herdar comportamento n ao desejado, implicando num comportamento INCORRETO da subclasse

Exemplo
Classes Lista <<instance_of>> adicionaInicio() removeInicio() adicionaFim() removeFim() l:Lista adicionaInicio() removeInicio() adicionaFim() removeFim() Objetos Mensagens Entendidas

Pilha

<<instance_of>> p:Pilha

usa adicionaFim() usa removeFim()

empilha() desempilha()

adicionaInicio() removeInicio() adicionaFim() removeFim() empilha() desempilha()

Solu c ao Recomendada em Java (I)


Pilha Lista + empilhar (e:Elemento ):void + desempilhar ():Elemento + devolverTopo ():Elemento + estaCheia ():boolean + estaVazia ():boolean 1 + adicionarInicio (e:Elemento ):void + removerInicio ():Elemento + adicionarFim (e:Elemento ):void + removerFim ():Elemento + estaCheia ():boolean + estaVazia ():boolean Lista

Pilha

NO RECOMENDADO

RECOMENDADO

Solu c ao Recomendada em Java (II)


Lista Pilha lista:Lista +empilha():. +desempilha():. Pilha +adicionaInicio():. +removeInicio():. +adicionaFim():. +removeFim():. Lista

NO RECOMENDADO

RECOMENDADO

Solu c ao Usando Agrega c ao (Java)


class Pilha{ private Lista l; // apontador para um objeto da Lista // este atributo implementa o // relacionamento de agrega c~ ao da hierarquia public Pilha(){l = new Lista()} public void empilha(int x){l.adicionaFim(x);} public int desempilha(){return l.removeFim();} }

Deriva c ao P ublica
Java:class Derivada extends Base... C++: class Derivada: public Base ...; Todos os membros p ublicos da classe Base tornam-se membros p ublicos da classe Derivada.

Exemplo de Deriva c ao P ublica (I)


class Lista{ // lista de inteiros public: Lista(){...} void adicionaInicio(int x){ // x e a nova cabe ca da lista } int removeInicio(){ // remove e retorna o valor final da lista // pr e-condi c~ ao: !estaVazia() }

Exemplo de Deriva c ao P ublica (II)


int removeFim(){ // remove e retorna o ultimo // elemento da lista //pr e-condi c~ ao: !estaVazia() } void adicionaFim(int x){ // x torna-se o ultimo elemento da lista } ... }

Exemplo de Deriva c ao P ublica (III)


class Pilha : public Lista{ public: Pilha(){...} void empilha(int x){adicionaFim(x);} int desempilha(){return removeFim();} } ... Pilha* plh = new Pilha(); plh->adicionaInicio(37); // corrompe o estado da pilha O problema e que plh tamb em herda opera co es que n ao t em nada a ver com a sem antica de pilhas (heran ca de implementa ca o)

Deriva c ao Privada (C++) (I)


class Derivada: private Base ...; Todos os membros p ublicos da classe Base tornam-se membros privados da classe Derivada. class Pilha : private Lista{ public: Pilha(){} void empilha(int x){adicionaFim(x);} int desempilha(){return removeFim();} }; Pilha* plh = new Pilha(); plh.adicionaInicio(37); // erro de compilacao Por qu e? Restri ca o de visibilidade (heran ca X instancia ca o)

Deriva c ao Privada (C++) (II)


Lista Pilha Lista

<< implementation >> Pilha

+empilha():. +desempilha():.

+adicionaInicio():. +removeInicio():. +adicionaFim():. +removeFim():.

NO RECOMENDADO

RECOMENDADO

Solu c ao Usando Agrega c ao (C++)


Solu c ao utilizando agrega c ao: class Pilha{ private: Lista* l; // um apontador para //objeto do tipo Lista public: Pilha(){l = new Lista;} void empilha(int x){l->adicionaFim(x);} int desempilha() {return l->removeFim();} Boolean estaVazia(){return l->estaVazia();} Boolean estaCheia(){return l->estaCheia();} }

Heran ca de Comportamento (I)


Mamifero

Humano

Baleia

Gato

Heran ca de Comportamento (II)


ca de comportamento representa uma hierarquia Heran verdadeira de generaliza c ao/especializa c ao Heran ca de comportamento equivale ao relacionamento e-um, ou e-subtipo-de No exemplo, podemos dizer que o tipo Humano e um tipo especializado de Mam fero ou que o tipo Humano e um subtipo de Mam fero

O Conceito de Subtipo (I)


Subtipo preocupa-se com o compartilhamento de comportamento (behaviour sharing) Ent ao, se S e um subtipo de T , um objeto do tipo S pode ser usado no lugar de um objeto de tipo T A id eia principal e que classes derivadas comportemse como se fossem as classes bases

O Conceito de Subtipo (II)


Dizemos que o subtipo S se conforma ao tipo T No modelo de objetos, o compartilhamento de comportamento e somente justic avel quando existe um relacionamento verdadeiro de generaliza c ao/especializa c ao entre as classes No caso, hierarquia de generaliza c ao/especializa c ao ao e verdadeira, pois exisdenida por Lista e Pilha n tem opera co es de Lista que invalidam o comportamento da classe Pilha Portanto, voc e n ao deve usar heran ca. Use o relacionamento de agrega c ao no lugar

Exemplo de Uso de Heran ca (I)


Descri c ao do Problema

Em um sistema banc ario, uma classe ContaCor, que representa uma conta corrente, deve oferecer tr es opera co es: (i) creditaValor(); (ii) debitaValor(); e (iii) devolveSaldo(). Al em disso, uma conta corrente pode ser classicada como especial (ContaEsp), que e um tipo de conta corrente. Diferentemente de uma conta corrente comum, ao se criar uma conta corrente especial, e adicionado um valor de R$ 200,00 ao saldo da conta. Esse valor se refere ao limite de cr edito oferecido pelo banco. A classe ContaEsp dene duas novas opera co es: (i) alteraLimite(); e (ii) devolveLimiteUsado().

Exemplo de Uso de Heran ca (II)


ContaCor estado :int senta :int numConta :int titular :String saldoAtual :double << create >> + ContaCor (nome :Strng ,val:double ,num :int ,pwd :int ):ContaCor + creditarValor (valor :double ):boolean + debitarValor (val:double ,pwd :int ):boolean + devolverSaldo (pwd :int ):double

ContaEsp limite :double << create >> + ContaEsp (nome :Strng ,val:double ,num :int ,pwd :int ,lim :double ):ContaEsp + alterarLimite (lim :double ,pwd :int ):boolean + devolverLimiteUsado (pwd :int ):double

Classe ContaCor
// arquivo ContaCor.java class ContaCor { private int estado; // 1 = ativo ; 2 = inativo private int senha; private int numConta; private String titular; private double saldoAtual; public ContaCor(String nome, double val, int num ,int pwd) {...} } public boolean creditarValor(double val) {...} public boolean debitarValor(double val, int pwd) {...} public double devolverSaldo(int pwd) {...}

Classe ContaEsp (I)


//arquivo ContaEsp.java class ContaEsp extends ContaCor{ private float limite; ContaEsp(String nome, float val, int num, int pwd, double lim){ super(nome, val, num, pwd); // construtor da // superclasse limite = lim; creditarValor(limite); } // fim do construtor ContaEsp()

Classe ContaEsp (II)


public boolean alteraLimite(double lim, int pwd){ boolean r; if(lim > limite) // aumenta o limite r = this.creditarValor(lim-limite); else // redu c~ ao de limite r = this.debitarValor(limite-lim, pwd); if(r) limite = lim; // se lan camento ok, //altera o limite atual return r; } // fim de alteraLimite

Classe ContaEsp (III)


public double devolverLimiteUsado(int pwd){ souble s; s = this.devolverSaldo(pwd); // obtem saldo atual if (s == -1) // senha invalida return -1; // fracasso if(s > limite) return 0; else return (limite - s); } // fim de devolveLimiteUsado()

Exerc cio 1
Um editor de desenhos geom etricos possui uma tela para desenhar. Essa tela pode ser constitu da de muitas guras. Figuras podem ser c rculos, linhas, pol gonos e grupos. Um grupo consiste de muitas guras e um pol gono e composto por um conjunto de linhas. Quando um cliente pede para que uma tela se desenhe, a tela, por sua vez, pede para cada uma das guras associadas que se desenhe. Da mesma forma, um grupo pede que todos os seus componentes se desenhem. Crie uma hierarquia de generaliza c ao/especializa c ao que classique essas diferentes guras geom etricas e identique o comportamento de cada tipo abstrato de dados que voc e criar, bem como os seus respectivos atributos.

Resposta Exerc cio 1

Resposta Exerc cio 1


Editor Tela

+desenhar():void

Figura * +desenhar():void

Crculo centro:. raio:. +desenhar():void

Linha ponto1:. ponto2:. +desenhar():void *

Polgono

Grupo

+desenhar():void

+desenhar():void

Heran ca M ultipla de Classes

Heran ca M ultipla de Classes (I)


Mamifero EntidadeVoadora Ave

MamiferoVoador << instance_of >>. morcego:MamiferoVoador

AveVoadora << . instance_of >> andorinha:AveVoadora

Heran ca M ultipla de Classes (II)


ClasseBase1 ClasseBase2

ClasseDerivada

Problemas com Heran ca M ultipla (I)


Quando uma classe herda de mais de um pai, existe a possibilidade de conitos, j a que opera co es e atributos com mesmo nome e sem anticas diferentes podem ser herdadas de superclasses diferentes

Problemas com Heran ca M ultipla (II)


ClasseBase1 ClasseBase2

+display():.

+display():.

ClasseDerivada

+display():???

Estrat egias para a Resolu c ao de Conitos


Lineariza c ao: especica uma ordem linear das classes (Flavors e CommonLoops) Renomea c ao: altera c ao dos nomes de atributos e opera co es com conitos (Eiel) Operador de Qualica c ao: sempre que ocorrer ambig uidade deve-se usar :: (C++)

Conito de Nomes em Eiel

Conito de Nomes em Eiel (I)


Em caso de conito de nomes, a regra em Eiel e muito simples, tais conitos s ao proibidos Assim, se as classes ClasseBase1 e ClasseBase2 t em uma mesma opera c ao display () e e denida a classe ClasseDerivada como: class ClasseDerivada export...inherit ClasseBase1; ClasseBase2 feature ... end esta classe e rejeitada pelo compilador

Conito de Nomes em Eiel (II)


O conito de nomes pode ser removido introduzindo uma ou mais subcl ausulas rename na cl ausula inherit da classe que est a sendo denida A deni c ao da classe C caria como a seguir: class ClasseDerivada export...inherit ClasseBase1 rename display() as ClasseBase1_display(); B feature ... end Em ClasseDerivada, a opera c ao display () da ClasseBase1 ser a referenciada como ClasseBase1 display () e a da ClasseBase2 ser a referenciada com display (). Os clientes da ClasseBase1, por sua vez, far ao refer encia ` a opera c ao display ()

Heran ca M ultipla em C++ (I)


Relogio hr :int min :int seg:int is_pm :int << create >> + Relogio (h:int ,s:int ,m :int ,pm :int ):Relogio + ajustarRelogio (h:int ,s:int ,m :int ,pm :int ):void + lerRelogio ():int[] + avancar ():void mes :int dia :int ano :int << create >> + Calendario (d:int ,m :int ,a:int ):Calendario + ajustarCalendario (d:int ,m :int ,a:int ):void + lerCalendario ():int[] + avancar ():void Calendario

RelogioCalendario

<< create >> + RelogioCalendario (d:int ,m :int ,a:ano ,h:int ,s:int ,m :int ,pm :int ):RelogioCalendario + avancar ():void

Heran ca M ultipla em C++ (II)


class Relogio { protected: int hr; int min; int seg; int is_pm; public: Relogio( int h, int s, int m, int pm){...} void ajustaHora(int h, int s, int m, int pm){...} void leRelogio(int& h, int& s, int& m, int& pm){...} void avanca(){...} // ------------> conflito de nome };

Heran ca M ultipla em C++ (III)


class Calendario { protected: int mes; int dia; int ano; public: Calendario( int d, int m, int a){...} void ajustaCalendario(int d, int m, int a){...} void leCalendario(int& d, int& m, int& y){...} void avanca(){...} // ----------> conflito de nome };

Heran ca M ultipla em C++ (IV)


class RelogioCalendario : public Relogio, public Calendario { public: RelogioCalendario (int d, int m, int a, int h, int mn, int s, int pm){...} void avanca(){ Relogio::avanca(); Calendario::avanca(); } //---------> M etodos Qualificados };

Exemplo de Heran ca M ultipla (I)


Termostato: dispositivo que mant em um sistema numa temperatura constante Um termostato envolve 2 elementos: um term ometro e uma chave Um Termostato pode ser visto como um tipo de term ometro e como um tipo de chave Um termostato mant em um sistema numa temperatura constante. A chave pode estar conectada a um sistema de aquecimento central e ir a desligar/ligar o sistema conforme a temperatura desejada

Exemplo de Heran ca M ultipla (II)


Termometro temperatura:. +getTemperatura():. Chave estadoChave:. +ligar():void +desligar():void // ligada ou // desligada

Termostato tempRequerida:. +setTempRequerida():. +fazerMonitoramento():. Termometro t = new Termostato; Chave c = new Termostato; Termostato ter = new Termostato;

if(getTemperatura() < tempRequerida){ ligar(); } else{ desligar(); }

Solu c ao Usando Agrega c ao


Termometro Termostato tempRequerida:float +setTempRequerida(temp:float):void +fazerMonitoramento():void temperatura:float +getTemperatura():void

Chave estadoChave:int +ligar():void +desligar():void

Solu c ao Usando Agrega c ao (I)


class Termometro{ private float temperatura; public float getTemperatura(){ return temperatura; } } class Chave{ private int estadoChave = 0; // 0-desligado; 1-ligado. public void ligar(){ estadoChave = 1; } public void desligar(){ estadoChave = 0; } }

Solu c ao Usando Agrega c ao (II)


class Termostato{ private Termometro termometro; private Chave chave; private float tempRequerida; public Termostato(){ // CONSTRUTOR termometro = new Termometro(); chave = new Chave(); } //FIM-CONSTRUTOR public void setTempRequerida(float temp){ tempRequerida = temp; } //FIM-SETTEMPREQUERIDA public void fazerMonitoramento(){ if (termometro.getTemperatura()>temperaturaRequerida) chave.desligar(); else chave.ligar(); }

Quando usar Heran ca M ultipla


Se a nova abstra c ao e um tipo de alguma outra abstra c ao, ou se o comportamento da nova abstra c ao e exatamente igual ` a soma das suas componentes ent ao heran ca m ultipla e mais apropriada Se a nova abstra c ao e maior, em termos de comportamento, do que a soma do comportamento das abstra co es bases

Problema do Diamante (I)


e caracterizado pela O problema do diamante ambig uidade causada heran ca repetida de atributos oriunda de um ancestral comum Os membros da classe ancestral s ao herdados por cada uma das classes intermedi arias A classe nal, que herda das classes intermedi arias possuem atributos replicados em endere cos de mem oria distintos.

Problema do Diamante (II)


Problema dodiamante

Ancestral atributo :.

Base1 atributo

Base2 atributo

Derivado atributo Cpia #1 atributo Cpia #2

Problema do Diamante (III)


c ao: as classes que herdam do ancestral co Solu mum devem utilizar o modicador virtual no relacionamento de heran ca
JanelaGrfica #curColor:Color

"deve ser (virtual)"


XWindow

"deve ser (virtual)"


EditWindow

EditXWindow

Problema do Diamante (IV)


class JanelaGrafica{ public: Window(); ... protected: Color curColor; } class XWindow : public virtual JanelaGrafica{...} class EditWindow : public virtual JanelaGrafica{...} class EditXWindow : public XWindow, public EditWindow{...}

Heran ca Simples e Agrega c ao


ContaBancaria

ContaPoup

ContaCorrentePoup

ContaCorrente

Perda: ContaCorrentePoup e um tipo de conta, mas ela n ao e um tipo de ContaPoup e nem ContaCorrente ContaBancaria = new ContaCorrentePoup(); ContaPoup = new ContaCorrentePoup(); // ERRO ContaCorrente = new ContaCorrentePoup(); // ERRO

Exerc cio 1
Uma abstra c ao pode ser vista atrav es de m ultiplas perspectivas. Por exemplo, uma pessoa pode ser classicada de acordo com o seu sexo como masculino ou feminino e pode tamb em ser classicada de acordo com a sua idade como crian ca, jovem e adulto.
Pessoa

SexoMasculino

SexoFeminino

Criana

Jovem

Adulto

Exerc cio 1 (Cont.)


(a) Apresente uma solu c ao de modelagem que combine essas duas perspectivas usando heran ca m ultipla. Note que um objeto pode ser instanciado a partir de apenas uma u nica classe (i.e., um objeto n ao pode ser inst ancia de 2 classes). Por exemplo, o objeto Jos e e do sexo masculino e adulto, mas ele n ao pode ser instanciado a partir de ambas as classes SexoMasculino e Adulto ao mesmo tempo. (b) Proponha uma solu c ao alternativa mais ex vel que supere as desvantagens identicadas no item anterior. (Dica: pense na hierarquia de agrega c ao/decomposi c ao.)

Respostas

Resposta Exerc cio 1 (a)


Pessoa

SexoMasculino

SexoFeminino

Criana

Jovem

Adulto

Menino

Menina

Mulher

...

Resposta Exerc cio 1 (b)


Pessoa

Sexo

FaixaEtaria

SexoMasculino

SexoFeminino

Criana

Jovem

Adulto

Potrebbero piacerti anche