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 11: Genericidade Genericidade usando herança Conceito de rotina genérica Conceito de classe genérica.

Apresentações semelhantes


Apresentação em tema: "2002/2003 Programação Orientada para Objectos 1 Aula 11: Genericidade Genericidade usando herança Conceito de rotina genérica Conceito de classe genérica."— Transcrição da apresentação:

1 2002/2003 Programação Orientada para Objectos 1 Aula 11: Genericidade Genericidade usando herança Conceito de rotina genérica Conceito de classe genérica Validação implícita dos parâmetros Parâmetros por omissão Notação UML para classes genéricas Construção de uma classe ou rotina genérica Regras para modularização física

2 2002/2003 Programação Orientada para Objectos 2 Cálculo do mínimo de dois valores /** Devolve o mínimo de a e ( mínimoDe idêntico a a e a <= b ) ou ( mínimoDe idêntico a b e b < a ). */ inline int mínimoDe(int const a, int const b) { return a <= b ? a : b; } /** Devolve o mínimo de a e ( mínimoDe idêntico a a e a <= b ) ou ( mínimoDe idêntico a b e b < a ). */ inline float mínimoDe(float const a, float const b) { return a <= b ? a : b; } /** Devolve o mínimo de a e ( mínimoDe idêntico a a e a <= b ) ou ( mínimoDe idêntico a b e b < a ). */ inline double mínimoDe(double const a, double const b) { return a <= b ? a : b; } /** Devolve o mínimo de a e ( mínimoDe idêntico a a e a <= b ) ou ( mínimoDe idêntico a b e b < a ). */ inline string const& mínimoDe(string const& a, string const& b) { return a <= b ? a : b; }

3 2002/2003 Programação Orientada para Objectos 3 Pilha de no máximo 100 inteiros /** Representa pilhas com no máximo 100 itens do tipo 0 <= número_de_itens <= N. */ class PilhaFixaDeInt100 { public: typedef int I; PilhaFixaDeInt100(); Item const& topo() const; bool estáVazia() const; bool estáCheia() const; int altura() const; Item& topo(); void põe(Item const& novo_item); void tiraItem(); private: static int const N = 100; I itens[N]; int número_de_itens; bool cumpreInvariante() const; }; PilhaFixaDeInt100::PilhaFixaDeInt100() : número_de_itens(0) { assert(cumpreInvariante()); } PilhaFixaDeInt100::I const& PilhaFixaDeInt100::topo() const { assert(cumpreInvariante()); assert(not estáVazia()); return itens[número_de_itens - 1]; }

4 2002/2003 Programação Orientada para Objectos 4 Pilha de no máximo 100 inteiros bool PilhaFixaDeInt100::estáVazia() const { assert(cumpreInvariante()); return altura() == 0; } bool PilhaFixaDeInt100::estáCheia() const { assert(cumpreInvariante()); return altura() == N; } void PilhaFixaDeInt100::põe(I const& novo_ item) { assert(cumpreInvariante()); assert(not estáCheia()); itens[número_de_itens] = novo_ item; ++número_de_itens; assert(cumpreInvariante()); } int PilhaFixaDeInt100::altura() const { return número_de_itens; } … void PilhaFixaDeInt100::tiraItem() { assert(cumpreInvariante()); assert(not estáVazia()); --número_de_itens; assert(cumpreInvariante()); } bool PilhaFixaDeInt100::cumpreInvariante() const { return 0 <= numero_de_itens and numero_de_itens <= N; }

5 2002/2003 Programação Orientada para Objectos 5 Rotina genérica mínimoDe /** Devolve o mínimo de a e T tipo dos ( mínimoDe idêntico a a e a <= b ) ou ( mínimoDe idêntico a b e b < a ). */ template inline T const& mínimoDe(T const& a, T const& b) { return a <= b ? a : b; }

6 2002/2003 Programação Orientada para Objectos 6 Como se usa? Instanciando-se: cout (10, 5) << endl; cout (1.3f, 4.4f) << endl; cout (10.1, 5.5) << endl; cout ("olá", "mundo") << endl; O C++ deduz, sempre que possível, os argumentos da função genérica a partir dos tipos dos argumentos da função: cout << mínimoDe(10, 5) << endl; cout << mínimoDe(1.3f, 4.4f) << endl; cout << mínimoDe(10.1, 5.5) << endl;

7 2002/2003 Programação Orientada para Objectos 7 Rotina genérica arredondamentoDe /** Devolve o arredondamento de arredondamentoDe = inteiro mais próximo de valor e em caso de empate o mais longe de zero. */ template I arredondamentoDe(F const valor) { if(0 <= valor) return I(valor + F(0.5)); return I(valor - F(0.5)); }

8 2002/2003 Programação Orientada para Objectos 8 Pilha de no máximo 100 inteiros /** Representa pilhas com no máximo 100 itens do tipo 0 <= número_de_itens <= N. */ class PilhaFixaDeInt100 { public: typedef int I; PilhaFixaDeInt100(); Item const& topo() const; bool estáVazia() const; bool estáCheia() const; int altura() const; Item& topo(); void põe(Item const& novo_item); void tiraItem(); private: static int const N = 100; I itens[N]; int número_de_itens; bool cumpreInvariante() const; }; PilhaFixaDeInt100::PilhaFixaDeInt100() : número_de_itens(0) { assert(cumpreInvariante()); } PilhaFixaDeInt100::I const& PilhaFixaDeInt100::topo() const { assert(cumpreInvariante()); assert(not estáVazia()); return itens[número_de_itens - 1]; }

9 2002/2003 Programação Orientada para Objectos 9 Pilha de no máximo 100 inteiros bool PilhaFixaDeInt100::estáVazia() const { assert(cumpreInvariante()); return altura() == 0; } bool PilhaFixaDeInt100::estáCheia() const { assert(cumpreInvariante()); return altura() == N; } void PilhaFixaDeInt100::põe(I const& novo_ item) { assert(cumpreInvariante()); assert(not estáCheia()); itens[número_de_itens] = novo_ item; ++número_de_itens; assert(cumpreInvariante()); } int PilhaFixaDeInt100::altura() const { return número_de_itens; } … void PilhaFixaDeInt100::tiraItem() { assert(cumpreInvariante()); assert(not estáVazia()); --número_de_itens; assert(cumpreInvariante()); } bool PilhaFixaDeInt100::cumpreInvariante() const { return 0 <= numero_de_itens and numero_de_itens <= N; }

10 2002/2003 Programação Orientada para Objectos 10 Classe genérica PilhaFixaDe /** Representa pilhas com no máximo N itens do tipo I tipo dos N número máximo de 0 <= número_de_itens <= N. */ template class PilhaFixaDe { public: PilhaFixaDe(); Item const& topo() const; bool estáVazia() const; bool estáCheia() const; int altura() const; Item& topo(); void põe(Item const& novo_item); void tiraItem(); private: I itens[N]; int número_de_itens; bool cumpreInvariante() const; }; template PilhaFixaDe ::PilhaFixaDeInt100() : número_de_itens(0) { assert(cumpreInvariante()); } template I const& PilhaFixaDe ::topo() const { assert(cumpreInvariante()); assert(not estáVazia()); return itens[número_de_itens - 1]; }

11 2002/2003 Programação Orientada para Objectos 11 Classe genérica PilhaFixaDe template bool PilhaFixaDe ::estáVazia() const { assert(cumpreInvariante()); return altura() == 0; } … template void PilhaFixaDe ::põe(I const& novo_ item) { assert(cumpreInvariante()); assert(not estáCheia()); itens[número_de_itens] = novo_ item; ++número_de_itens; assert(cumpreInvariante()); } … template void PilhaFixaDe ::tiraItem() { assert(cumpreInvariante()); assert(not estáVazia()); --número_de_itens; assert(cumpreInvariante()); } template bool PilhaFixaDe ::cumpreInvariante() const { return 0 <= numero_de_itens and numero_de_itens <= N; }

12 2002/2003 Programação Orientada para Objectos 12 Como se usa? PilhaFixaDe ps; ps.põe(Olá); ps.põe(mundo!);

13 2002/2003 Programação Orientada para Objectos 13 Regras para os módulos físicos Classes no ficheiro de interface.H Declarações de rotinas não-membro no ficheiro de interface.H Definições: Inline em _impl.H Não inline em _impl.H

14 2002/2003 Programação Orientada para Objectos 14 UML PilhaFixaDe -itens: I[N] -número_de_itens: int «query» … «update» … { typedef PilhaFixaDe PilhaFixaDeString200; } PilhaFixaDe PilhaFixaDeString200 Instanciação implícitaInstanciação explícita I = int, N: int = 100 «bind» (string, 200)


Carregar ppt "2002/2003 Programação Orientada para Objectos 1 Aula 11: Genericidade Genericidade usando herança Conceito de rotina genérica Conceito de classe genérica."

Apresentações semelhantes


Anúncios Google