A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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,

Apresentações semelhantes


Apresentação em tema: "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,"— Transcrição da apresentação:

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


Carregar ppt "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,"

Apresentações semelhantes


Anúncios Google