Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouEvelyn Medeiros Alterado mais de 10 anos atrás
1
2002/2003 Programação Orientada para Objectos 1 Aula 7 - Herança Herança pública: relação é um. A relação tem um. A relação é composto por um. Ponteiros, referências e corte (slicing). Derivação: classe base e classe derivada. Construtores e destrutores com herança. Ocultação. Hierarquias de classes: derivações de derivações. Possibilidade de herança múltipla. Problemas por resolver: necessidade de polimorfismo. Herança privada: redução/alteração de interfaces. Políticas de acesso.
2
2002/2003 Programação Orientada para Objectos 2 Relação de generalização Relação de generalização Empregado Chefe Atributos e operações omitidos
3
2002/2003 Programação Orientada para Objectos 3 Impacto da modelação da relação Corte (ou slicing) Chefe ana_maria(Ana Maria, feminino, 4); Empregado sósia_da_ana_maria_como_empregado = ana_maria; Cópia da Ana Maria cortando tudo aquilo que a torna chefe. Não é muito útil: a evitar!
4
2002/2003 Programação Orientada para Objectos 4 Impacto da modelação da relação list empregados; empregados.push_back(new Empregado("João Maria", masculino)); empregados.push_back(new Chefe("Ana Maria", feminino, 4));... for(list ::const_iterator i = empregados.begin(); i != empregados.end(); ++i) { (*i)->mostra(); cout << endl; }
5
2002/2003 Programação Orientada para Objectos 5 Solução 1: distinção interna do tipo de Empregado class Empregado { public: enum Tipo {empregado, chefe}; Empregado(Tipo const tipo, string const& nome, Sexo const sexo, int const nível = 0); string const& nome() const; Sexo sexo() const; int nível() const; void mostra() const; private: string nome_; Sexo sexo_; int nível_; Tipo tipo; }; Uma só classe representa todos os tipos de empregados.
6
2002/2003 Programação Orientada para Objectos 6 Problemas da solução 1 Construtor teria de prever todos os casos e verificar todas as combinações impossíveis. Todos os métodos com especializações para cada tipo de empregado seriam monstruosos, dominados por inúmeros e gigantescos switch … Código: difícil de compreender. difícil de estender. difícil de alterar. difícil de depurar.
7
2002/2003 Programação Orientada para Objectos 7 Solução 2: um Empregado dentro de um Chefe class Chefe { public: Chefe(string const& nome, Sexo const sexo, int const nível); string const& nome() const; Sexo sexo() const; int nível() const; void mostra() const; private: Empregado empregado; int nível_; };... inline void Chefe::mostra() const { empregado.mostra(); cout << "Nível: " << nível() << endl; } Duas classes: Chefe delega em empregado. Permite poupar código.
8
2002/2003 Programação Orientada para Objectos 8 Problemas da solução 2 Ainda não é possível tratar um chefe como se de um empregado se tratasse. Dá a sensação que os chefes possuem fisicamente um pequenino homúnculo dentro deles encarregue de trabalhar por eles... O nosso código não corresponde ao que queremos modelar, o que é sempre má ideia.
9
2002/2003 Programação Orientada para Objectos 9 Solução: herança pública class Chefe : public Empregado { public: Chefe(string const& nome, Sexo const sexo, int const nível); int nível() const; void mostra() const; private: int nível_; }; inline int Chefe::nível() const { return nível_; }
10
2002/2003 Programação Orientada para Objectos 10 Solução: herança pública Ocultação (e especialização do método da classe base) inline void Chefe::mostra() const { Empregado::mostra(); cout << "Nível: " << nível() << endl; } Construtor inline Chefe::Chefe(string const& nome, Sexo const sexo, int const nível) : Empregado(nome, sexo), nível_(nível) {}
11
2002/2003 Programação Orientada para Objectos 11 Hierarquias de classes Veículo VeículoAéreoVeículoTerrestreVeículoNaval HelicópteroAvião Hidroavião
12
2002/2003 Programação Orientada para Objectos 12 Herança privada (I) Os métodos públicos da classe base tornam-se privados da classe derivada! Não é estabelecida relação é um entre a classe derivada e a classe base. Sempre que um conceito for diferente de outro, mas puder ser implementado à sua custa com pequenas variações (normalmente, restrições da interface), então pode-se usar. No fundo, uma herança privada estabelece um tipo especial de relação: funciona como um… mas…
13
2002/2003 Programação Orientada para Objectos 13 Herança privada (II) class PilhaDeInt { public: typedef ListaDeInt::Item Item; int altura() const; bool estáVazia() const; Item const& topo() const; Item& topo(); void põe(Item const& novo_item); void tiraItem(); private: ListaDeInt lista; }; class PilhaDeInt : private ListaDeInt { public: typedef ListaDeInt::Item Item; int altura() const; bool estáVazia() const; Item const& topo() const; Item& topo(); void põe(Item const& novo_item); void tiraItem(); };
14
2002/2003 Programação Orientada para Objectos 14 Herança privada (III) class PilhaDeInt : private ListaDeInt { public: using ListaDeInt::Item; int altura() const; using ListaInt::estáVazia; Item const& topo() const; Item& topo(); void põe(Item item); void tiraItem(); }; class PilhaDeInt : private ListaDeInt { public: using ListaDeInt::Item; using ListaDeInt::comprimento; using ListaDeInt::estáVazia; using ListaDeInt::trás; using ListaDeInt::põeAtrás; using ListaDeInt::tiraDeTrás; };
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.