BCC Programação Orientada a Objectos(POO) Departamento de Computação - UFOP Baseado nos slides do Prof. Marco Antônio Carvalho

Documentos relacionados
Programação Orientada a Objetos para Redes de Computadores

Programação aplicada de computadores Andréa Maria Pedrosa Valli

Linguagens de Programação

Java Como Programar, 8/E

Conversão de Tipos. BCC Programação Orientada a Objectos(POO)

Universidade Federal de Mato Grosso do Sul. Propriedades da Programação Orientada a Objetos

Herança Sendo uma linguagem orientada a objetos Java oferece mecanismos para definir classes derivadas a partir de classes existentes; As classes deri

Polimorfismo. BCC Programação Orientada a Objectos(POO) Departamento de Computação - UFOP Baseado nos slides do Prof. Marco Antônio Carvalho

Programação Avançada C++ Slide 12 Nielsen Castelo Damasceno

Introdução à Programação. Encapsulamento e Herança

BCC221 Programação Orientada a Objetos. Prof. Marco Antonio M. Carvalho 2014/2

Classes e Objetos. Sintaxe de classe em Java

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

Herança. BCC702-Programação de Computadores II Emiliana Mara Lopes Simões Universidade Federal de Ouro Preto abril 2010

Herança Tiago Eugenio de Melo

Laboratório de programação II

Classes. BCC Programação Orientada a Objectos(POO) Departamento de Computação - UFOP Baseado nos slides do Prof. Marco Antônio Carvalho

Programação Orientada a Objetos para Redes de Computadores. Polimorfismo com Hierarquias de Herança. Exemplo: Hierarquia Animal

BCC221 Programação Orientada a Objetos. Prof. Marco Antonio M. Carvalho 2014/2

Aula 7 POO 1 Herança. Profa. Elaine Faria UFU

POO e C++: Herança e Polimorfismo

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Conceitos de Programação Orientada a Objetos

Programação por Objectos. Java

Templates. BCC Programação Orientada a Objectos(POO) Departamento de Computação - UFOP

Programação orientada a objetos: Polimorfismo by Pearson Education do Brasil

Friends e Sobrecarga

Orientação a Objetos (OO) LPG II - Java. Orientação a Objetos (OO) Programação Orientada a Objetos. Programação Procedimental

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

Java - Polimorfismo. BCC Programação Orientada a Objectos(POO) Departamento de Computação - UFOP

4 Conceito de Herança

Auto-Referenciamento e Herança

Introdução ao Java. Prof. Herbert Rausch Fernandes

Java - Sobrecarga/Composição

Programação Orienta a Objetos

ORIENTAÇÃO A OBJETOS SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Linguagem de Programação Orientada a Objeto Abstração - Encapsulamento

Notas de Aula 04: Herança e polimorfismo.

BCC221 Programação Orientada a Objetos. Prof. Marco Antonio M. Carvalho 2014/2

Programação Orientada a Objetos para Redes de Computadores

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Orientação a Objetos parte 2 ENCAPSULAMENTO, CLASSES, HERANÇAS

DCC / ICEx / UFMG. Membros de Classes. Eduardo Figueiredo.

Orientação a Objetos (OO) Java Avançado Revisão do Paradigma de. Orientação a Objetos (OO) Programação Orientada a Objetos. Programação Procedimental

Programação Orientada a Objetos HERANÇA E COMPOSIÇÃO

Programação orientada a objetos: Herança Pearson Education do Brasil

Herança e Propriedades

A B Classe Genérica D A C. Classe Especializada. Classe Especializada. Características Herdadas

Programação Orientada a Objetos JAVA - NETBEANS

Modelo do Mundo Real. Abstração. Interpretação

Linguagem de Programação. Diagrama de classes

Java First-Tier: Aplicações. Sobrecarga. Orientação a Objetos em Java (II) Sobrecarga de Construtores: Exemplo de Declaração

Programação I Curso: Sistemas de Informação. Prof.: José Ronaldo Leles Júnior .:

POO Fundamentos Parte III. Professor Vicente Paulo de Camargo

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

UML. Diagrama de Classe

Aula 9 Herança. Prof. Jefersson Alex dos Santos

C com introdução a OO

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Curso de PHP. - Início 22 de agosto - Término 20 de outubro. -Aulas: segunda e quinta-feira -Horário:18h às 20h. -Carga horária do curso: 40h

Java para Desktop. Programação Orientada à Objetos 2 JSE

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Modificadores de acesso e atributos de classe

Herança - Conceitos Básicos

Programação Orientada a Objetos HERANÇA E COMPOSIÇÃO

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Linguagem de programação Programação Orientada a objetos

Linguagem de Programação II Programação Orientada a Objetos. Orientação a Objetos

Prof. Rogério Albuquerque de Almeida. Programação Orientada a Objetos II Java Terceira aula

CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS Disciplina: Programação Orientada a Objetos

Linguagem de Programação III

PROGRAMAÇÃO I HERANÇA E POLIMORFISMO

O PARADIGMA ORIENTADO POR OBJETOS

Linguagens de Programação Aula 12

Herança. Prof. Leonardo Barreto Campos 1

Classes II. BCC Programação Orientada a Objectos(POO) Departamento de Computação - UFOP Baseado nos slides do Prof. Marco Antônio Carvalho

Unidade: sobrecarga, construtores e herança

Como exemplo, vamos criar uma subclasse da classe Funcionario, vista nos capítulos anteriores.

Visibilidade e Encapsulamento

Unidade Acadêmica: Faculdade de Computação FACOM Disciplina: Programação Orientada a Objetos I Professor: Fabiano Azevedo Dorça. Prática 02 Herança

E N C A P S U L A M E N T O P R O F. M E. H É L I O E S P E R I D I Ã O

Física Computacional

Python Orientação a Objetos. Introdução à Programação SI2

Programação Orientada a Objetos

Programação Orientada a Objetos

Parte IV. Linguagens de Programação. Relembrando da Última Aula... Exemplos de Polimorfismo. Exemplo: Hierarquia Animal

PROGRAMAÇÃO ORIENTADA A

Programação Orientada a Objetos

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Herança e Polimorfismo - Parte II -

Curso teórico: Orientação a Objetos. Matemática computacional Marcos Aurelio Wozhiak Jr webzhiak.com.br

UNIVERSIDADE PAULISTA - UNIP ICET INSTITUTO DE CIÊNCIAS EXATAS E TECNOLÓGIA

Programação Orientada a Objetos

Programação Orientada a Objetos em C++: introdução à herança

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

VB.NET - Orientação a objetos : conceitos básicos em 10

Linguagem de Programação IV Introdução

Java First-Tier: Aplicações. Herança: Simples Múltipla. Orientação a Objetos em Java (III) Problemas de Herança Múltipla.

TÉCNICAS DE ORIENTAÇÃO A OBJETOS

Transcrição:

Herança BCC 221 - Programação Orientada a Objectos(POO) Guillermo Cámara-Chávez Departamento de Computação - UFOP Baseado nos slides do Prof. Marco Antônio Carvalho

Introdução I A herança é uma forma de reuso de software O programador cria uma classe que absorve os dados e o comportamento de uma classe existente; Ainda é possível aprimorá-la com novas capacidades. 1/67

Introdução II Além de reduzir o tempo de desenvolvimento, o reuso de software aumenta a probabilidade de eficiência de um software Componentes já debugados e de qualidade provada contribuem para isto. 2/67

Introdução III Uma classe existente e que será absorvida é chamada de classe base (ou superclasse); A nova classe, que absorve, é chamada de classe derivada (ou subclasse) Considerada uma versão especializada da classe base. 3/67

Introdução IV É importante identificar a diferença entre composição e herança: Na herança, um objeto da subclasse é um objeto da superclasse. Por exemplo, o carro é um veículo; Enquanto que na composição um objeto tem um outro objeto. Por exemplo, o carro tem uma direção. 4/67

Herança I Herança é o mecanismo pelo qual elementos mais específicos incorporam a estrutura e comportamento de elementos mais gerais. Uma classe derivada herda a estrutura de atributos e métodos de sua classe base, mas pode seletivamente: adicionar novos métodos estender a estrutura de dados redefinir a implementação de métodos já existentes 5/67

Herança II Uma classe pai ou super classe proporciona a funcionalidade que é comum a todas as suas classes derivadas, filhas ou sub classe, Uma classe derivada proporciona a funcionalidade adicional que especializa seu comportamento. 6/67

Herança III 7/67

Herança IV Um possível problema com herança é ter que herdar atributos ou métodos desnecessários ou inapropriados É responsabilidade do projetista determinar se as características da classe base são apropriadas para herança direta e também para futuras classes derivadas. 8/67

Herança V Ainda, é possível que métodos necessários não se comportem de maneira especificamente necessária Nestes casos, é possível que a classe derivada redefina o método para que este tenha uma implementação específica. Um objeto de uma classe derivada pode ser tratado como um objeto da classe base. 9/67

Herança VI Os métodos de uma classe derivada podem necessitar acesso aos métodos e atributos da classe base Somente os membros não privados estão disponíveis; Membros que não devem ser acessíveis através de herança devem ser privados; Atributos privados poderão ser acessíveis por getters e setters públicos 10/67

Exemplo 1 I Hierarquia de classes para descrever a comunidade acadêmica: classe CommunityMember; Primeiras formas de especialização serão Empregados (Employee); Estudantes (Students); Ex-Alunos (Alumnus); 11/67

Exemplo 1 II Entre os empregados, temos: Corpo docente (Faculty); Funcionários de apoio (Staff). Entre o corpo docente (Faculty) temos: Professores (Teacher) Administradores (Administrator) 12/67

Exemplo 1 III Cada seta na hierarquia apresentada a seguir representa um relacionamento é um ; CommunityMember é a base direta ou indireta de todas as classes da hierarquia. 13/67

Exemplo 1 IV 14/67

Exemplo 1 V Sintaxe em C++ c l a s s c l a s s e d e r i v a d a : a c e s s o c l a s s e base { corpo da nova c l a s e } O operador acesso é opcional, mas claro se presente tem de ser public, private ou protected. 15/67

Exemplo 1 VI Se o acesso for public membros public da classe base: é como fazer copias dos métodos e colocássemos como public na classe derivada membros private: não são passados, acessível apenas pelo métodos da classe base e funções amigas membros protected: são copiados como protected na classe derivada Funções amigas (friend) não são herdadas. 16/67

Exemplo Funcionários I São considerados dois tipos de funcionários: Funcionários Comissionados são pagos com comissões sobre vendas; Funcionários Comissionados com salário base são pagos com um salário fixo e também recebem comissões sobre vendas. 17/67

Exemplo Funcionários II A partir deste contexto, serão apresentados 4 exemplos: 1. Classe ComissionEmployee, que representa funcionários comissionados Membros Privados 2. Classe BasePlusCommissionEmployee, que representa funcionários comissionados com salário base. Sem herança. 18/67

Exemplo Funcionários III 3. Nova classe BasePlusCommissionEmployee Usando herança; Classe ComissionEmployee com membros protected. 4. Nova herança, porém, classe ComissionEmployee com membros private. 19/67

ComissionEmployee I ComissionEmployee firstname:string lastname:string socialsecuritynumber:string grosssales:double comissionrate:double +earning():double +print():void +getters e setters 20/67

ComissionEmployee.h I #i f n d e f COMISSION H #d e f i n e COMISSION H #i n c l u d e <s t r i n g > u s i n g s t d : : s t r i n g ; c l a s s ComissionEmployee { s t r i n g f i r s t N a m e ; s t r i n g lastname ; s t r i n g s o c i a l S e c u r i t y N u m b e r ; d o u b l e g r o s s S a l e s ; d o u b l e c o m i s s i o n R a t e ; p u b l i c : ComissionEmployee ( c o n s t s t r i n g &, c o n s t s t r i n g &, c o n s t s t r i n g &, d o u b l e =0.0, d o u b l e = 0. 0 ) ; ComissionEmployee ( ) ; v o i d s e t F i r s t N a m e ( c o n s t s t r i n g &); s t r i n g getfirstname ( ) c o n s t ;... 21/67

ComissionEmployee.h II } ; #e n d i f... v o i d setlastname ( c o n s t s t r i n g &); s t r i n g getlastname ( ) c o n s t ; v o i d s e t S o c i a l S e c u r i t y N u m b e r ( c o n s t s t r i n g &); s t r i n g g e t S o c i a l S e c u r i t y N u m b e r ( ) c o n s t ; v o i d s e t G r o s s S a l e s ( d o u b l e ) ; d o u b l e g e t G r o s s S a l e s ( ) c o n s t ; v o i d s e t C o m i s s i o n R a t e ( d o u b l e ) ; d o u b l e g e t C o m i s s i o n R a t e ( ) c o n s t ; d o u b l e e a r n i n g s ( ) c o n s t ; v o i d p r i n t ( ) c o n s t ; 22/67

ComissionEmployee.h III Os atributos são privados Não acessíveis por classes derivadas. Os getters e setters desta classe são públicos Acessíveis por classes derivadas; Podem ser utilizados como meio para acessar os atributos Além disto, getters são declarados como const Não podem alterar o valor de nenhum argumento. 23/67

ComissionEmployee.cpp I #i n c l u d e " ComissionEmployee.h" ComissionEmployee : : ComissionEmployee ( c o n s t s t r i n g& f i r s t, c o n s t s t r i n g& l a s t, c o n s t s t r i n g& ssn, d o u b l e s a l e s, d o u b l e r a t e ){ f i r s t N a m e = f i r s t ; lastname = l a s t ; s o c i a l S e c u r i t y N u m b e r = s s n ; s e t G r o s s S a l e s ( s a l e s ) ; s e t C o m i s s i o n R a t e ( r a t e ) ; } ComissionEmployee : : ComissionEmployee ( ) { } v o i d ComissionEmployee : : s e t F i r s t N a m e ( c o n s t s t r i n g& f i r s t ){ f i r s t N a m e = f i r s t ; } s t r i n g ComissionEmployee : : getfirstname ( ) c o n s t { r e t u r n f i r s t N a m e ; } 24/67

ComissionEmployee.cpp II Note que o construtor da classe base acessa e realiza atribuições aos atributos diretamente Os atributos sales e rate são acessados através de métodos porque estes realizam testes de consistência nos valores passados por parâmetros; Os demais atributos também poderiam ser checados quanto a sua consistência 25/67

ComissionEmployee.cpp III v o i d ComissionEmployee : : setlastname ( c o n s t s t r i n g& l a s t ){ lastname = l a s t ; } s t r i n g ComissionEmployee : : getlastname ( ) c o n s t { r e t u r n lastname ; } v o i d ComissionEmployee : : s e t S o c i a l S e c u r i t y N u m b e r ( c o n s t s t r i n g& s s n ){ s o c i a l S e c u r i t y N u m b e r = s s n ; } s t r i n g ComissionEmployee : : g e t S o c i a l S e c u r i t y N u m b e r ( ) c o n s t { r e t u r n s o c i a l S e c u r i t y N u m b e r ; } 26/67

ComissionEmployee.cpp IV v o i d ComissionEmployee : : s e t G r o s s S a l e s ( d o u b l e s a l e s ){ g r o s s S a l e s = ( s a l e s < 0)? 0 : s a l e s ; } d o u b l e ComissionEmployee : : g e t G r o s s S a l e s ( ) c o n s t { r e t u r n g r o s s S a l e s ; } v o i d ComissionEmployee : : s e t C o m i s s i o n R a t e ( d o u b l e r a t e ){ c o m i s s i o n R a t e = ( r a t e >= 0. 0 && r a t e <= 1. 0 )? r a t e : 0 ; } d o u b l e ComissionEmployee : : g e t C o m i s s i o n R a t e ( ) c o n s t { r e t u r n c o m i s s i o n R a t e ; } d o u b l e ComissionEmployee : : e a r n i n g s ( ) c o n s t { r e t u r n c o m i s s i o n R a t e g r o s s S a l e s ; } 27/67

ComissionEmployee.cpp V v o i d ComissionEmployee : : p r i n t ( ) c o n s t { cout<< "\n comission employee : " << f i r s t N a m e << " " << lastname << "\n social security number: " << s o c i a l S e c u r i t y N u m b e r << "\n gross sales: " << g r o s s S a l e s << "\n comission rate: " << c o m i s s i o n R a t e ; } 28/67

Main.cpp I #i n c l u d e <i o s t r e a m > #i n c l u d e <s t r i n g > #i n c l u d e <iomanip> #i n c l u d e " ComissionEmployee.h" u s i n g namespace s t d ; i n t main ( ) { ComissionEmployee employee ( "Sue", "Jones", "222-22 -2222", 1 0 0 0 0. 0, 0. 1 ) ; cout << f i x e d << s e t p r e c i s i o n ( 2 ) ; employee. p r i n t ( ) ; cout << "\n Employee earning : " << employee. e a r n i n g s ( ) ; } r e t u r n 0 ; 29/67

BasePlusComissionEmployee I BasePlusComissionEmployee firstname:string lastname:string socialsecuritynumber:string grosssales:double comissionrate:double basesalary:double +earning():double +print():void 30/67

BasePlusComissionEmployee II Vamos agora criar a classe BasePlusCommissionEmployee, que representa funcionários comissionados com salario base Embora seja uma especialização da classe anterior, vamos definir completamente a classe. 31/67

BasePlusComissionEmployee.h I #i f n d e f BASEPLUS H #d e f i n e BASEPLUS H #i n c l u d e <s t r i n g > u s i n g s t d : : s t r i n g ; c l a s s BasePlusComissionEmployee { s t r i n g f i r s t N a m e ; s t r i n g lastname ; s t r i n g s o c i a l S e c u r i t y N u m b e r ; d o u b l e g r o s s S a l e s ; d o u b l e c o m i s s i o n R a t e ; d o u b l e b a s e S a l a r y ; p u b l i c : BasePlusComissionEmployee ( c o n s t s t r i n g &, c o n s t s t r i n g &, c o n s t s t r i n g &, d o u b l e =0.0, d o u b l e =0.0, d o u b l e = 0. 0 ) ; BasePlusComissionEmployee ( ) ; v o i d s e t F i r s t N a m e ( c o n s t s t r i n g &); s t r i n g getfirstname ( ) c o n s t ;... 32/67

BasePlusComissionEmployee.h II... v o i d setlastname ( c o n s t s t r i n g &); s t r i n g getlastname ( ) c o n s t ; v o i d s e t S o c i a l S e c u r i t y N u m b e r ( c o n s t s t r i n g &); s t r i n g g e t S o c i a l S e c u r i t y N u m b e r ( ) c o n s t ; v o i d s e t G r o s s S a l e s ( d o u b l e ) ; d o u b l e g e t G r o s s S a l e s ( ) c o n s t ; v o i d s e t C o m i s s i o n R a t e ( d o u b l e ) ; d o u b l e g e t C o m i s s i o n R a t e ( ) c o n s t ; v o i d s e t B a s e S a l a r y ( d o u b l e ) ; d o u b l e g e t B a s e S a l a r y ( ) c o n s t ; d o u b l e e a r n i n g s ( ) c o n s t ; v o i d p r i n t ( ) c o n s t ; } ; #e n d i f 33/67

BasePlusComissionEmployee.h III Foram adicionados um atributo com respectivo getter e setter, além de um parâmetro adicional no construtor; O restante do código é basicamente redundante em relação à classe ComissionEmployee. 34/67

BasePlusComissionEmployee.cpp I #i n c l u d e " BasePlusComissionEmployee.h" BasePlusComissionEmployee : : BasePlusComissionEmployee ( c o n s t s t r i n g& f i r s t, c o n s t s t r i n g& l a s t, c o n s t s t r i n g& ssn, d o u b l e s a l e s, d o u b l e r a t e, d o u b l e s a l a r y ){ f i r s t N a m e = f i r s t ; lastname = l a s t ; s o c i a l S e c u r i t y N u m b e r = s s n ; s e t G r o s s S a l e s ( s a l e s ) ; s e t C o m i s s i o n R a t e ( r a t e ) ; s e t B a s e S a l a r y ( s a l a r y ) ; } BasePlusComissionEmployee : : BasePlusComissionEmployee ( ) {} 35/67

BasePlusComissionEmployee.cpp II v o i d BasePlusComissionEmployee : : s e t B a s e S a l a r y ( d o u b l e s a l a r y ){ b a s e S a l a r y = s a l a r y < 0? 0 : s a l a r y ; } d o u b l e BasePlusComissionEmployee : : g e t B a s e S a l a r y ( ) c o n s t { r e t u r n b a s e S a l a r y ; } d o u b l e BasePlusComissionEmployee : : e a r n i n g s ( ) c o n s t { r e t u r n b a s e S a l a r y + ( g r o s s S a l e s c o m i s s i o n R a t e ) 36/67

BasePlusComissionEmployee.cpp III v o i d BasePlusComissionEmployee : : p r i n t ( ) c o n s t { c o u t << "\n base - salaried comission employee : " << f i r s t N a m e << " " << lastname << "\n social security number: " << s o c i a l S e c u r i t y N u m b e r << "\n gross sales: " << g r o s s S a l e s << "\n comission rate: " << c o m i s s i o n R a t e ; << "\n base salary: " << b a s e S a l a r y ; } 37/67

Main.cpp I #i n c l u d e <i o s t r e a m > #i n c l u d e <s t r i n g > #i n c l u d e <iomanip> #i n c l u d e " BasePlusComissionEmployee.h" u s i n g namespace s t d ; i n t main ( ) { BasePlusComissionEmployee employee ( "Bob", "Lewis", "333-33 -3333", 5 0 0 0. 0, 0. 0 4, 3 0 0. 0 ) ; cout << f i x e d << s e t p r e c i s i o n ( 2 ) ; employee. p r i n t ( ) ; cout << "\n Employee earning : << employee. earnings (); return 0; } 38/67

Comparação I 39/67

Herança I Ambas as classes compartilham a maior parte dos atributos (privados); getters e setters também são compartilhados Foi acrescentado apenas um getter e um setter devido ao novo atributo. Literalmente o código original foi copiado e adaptado. Quando a redundância entre classes acontece, caracteriza-se a necessidade de herança. 40/67

Herança II A replicação de código pode resultar em replicação de erros: A manutenção é dificultada, pois cada cópia tem que ser corrigida; Define-se uma classe que absorverá os atributos e métodos redundantes A classe base; A manutenção dada na classe base se reflete nas classes derivadas automaticamente. 41/67

Herança III O próximo exemplo fixa a classe ComissionEmployee como classe base Será utilizada a mesma definição desta classe do exemplo anterior; Os atributos continuam privados. A classe BasePlusCommissionEmployee será a classe derivada 42/67

Herança IV Acrescenta-se o atributo basesalary; Acrescenta-se também getter e setter e redefinirá dois métodos. Qualquer tentativa de acesso aos membros privados da classe base gerará erro de compilação. 43/67

Herança V ComissionEmployee -firstname -lastname -socialsecuritynumber -grosssales -comissionrate +setfirstname() +getfirstname() +setlastname() +getlastname() +setsocialsecuritynumber() +getsocialsecuritynumber() +setgrosssales() +getgrosssales() +setcomissionrate() +getcomissionrate() +earnings() +print() BasePlusComissionEmployee -basesalary +setbasesalary() +getbasesalary() +earnings() +print() 44/67

BasePlusComissionEmployee.h I #i f n d e f BASEPLUS H #d e f i n e BASEPLUS H #i n c l u d e <s t r i n g > #i n c l u d e " ComissionEmployee.h" u s i n g s t d : : s t r i n g ; c l a s s BasePlusComissionEmployee : p u b l i c ComissionEmployee { d o u b l e b a s e S a l a r y ; p u b l i c : BasePlusComissionEmployee ( c o n s t } ; #e n d i f s t r i n g &, c o n s t s t r i n g &, c o n s t s t r i n g &, d o u b l e =0.0, d o u b l e =0.0, d o u b l e = 0. 0 ) ; BasePlusComissionEmployee ( ) ; v o i d s e t B a s e S a l a r y ( d o u b l e ) ; d o u b l e g e t B a s e S a l a r y ( ) c o n s t ; d o u b l e e a r n i n g s ( ) c o n s t ; v o i d p r i n t ( ) c o n s t ; 45/67

BasePlusComissionEmployee.h II O operador : define a herança; A herança é pública Todos os métodos públicos da classe base são também métodos públicos da classe derivada Embora não os vejamos na definição da classe derivada, eles fazem parte dela. Foi definido um construtor específico. É necessário incluir o header da classe a ser herdada 46/67

BasePlusComissionEmployee.cpp I #i n c l u d e " BasePlusComissionEmployee.h" BasePlusComissionEmployee : : BasePlusComissionEmployee ( c o n s t s t r i n g& f i r s t, c o n s t s t r i n g& l a s t, c o n s t s t r i n g& ssn, d o u b l e s a l e s, d o u b l e r a t e, d o u b l e s a l a r y ) : ComissionEmployee ( f i r s t, l a s t, ssn, s a l e s, r a t e ){ s e t B a s e S a l a r y ( s a l a r y ) ; } BasePlusComissionEmployee : : BasePlusComissionEmployee ( ) {} 47/67

BasePlusComissionEmployee.cpp II v o i d BasePlusComissionEmployee : : s e t B a s e S a l a r y ( d o u b l e s a l a r y ){ b a s e S a l a r y = s a l a r y < 0? 0 : s a l a r y ; } d o u b l e BasePlusComissionEmployee : : g e t B a s e S a l a r y ( ) c o n s t { r e t u r n b a s e S a l a r y ; } //classe derivada não pode acessar dados //private da classe base d o u b l e BasePlusComissionEmployee : : e a r n i n g s ( ) c o n s t { r e t u r n b a s e S a l a r y + ( g r o s s S a l e s c o m i s s i o n R a t e ) 48/67

BasePlusComissionEmployee.cpp III //classe derivada não pode acessar dados //private da classe base v o i d BasePlusComissionEmployee : : p r i n t ( ) c o n s t { c o u t << "\n base - salaried comission employee : " << f i r s t N a m e << " " << lastname << "\n social security number: " << s o c i a l S e c u r i t y N u m b e r << "\n gross sales: " << g r o s s S a l e s << "\n comission rate: " << c o m i s s i o n R a t e ; << "\n base salary: " << b a s e S a l a r y ; } 49/67

BasePlusComissionEmployee.cpp IV O construtor da classe derivada chama explicitamente o construtor da classe base É necessário que a classe derivada tenha um construtor para que o construtor da classe base seja chamado; Se o construtor da classe base não for chamado explicitamente, o compilador chamará implicitamente o construtor default (sem argumentos) da classe base Se este não existir, ocorrerá um erro de compilação. 50/67

BasePlusComissionEmployee.cpp V Os métodos earnings e print deste exemplo gerarão erros de compilação Ambos tentam acessar diretamente membros privados da classe base, o que não é permitido Utilizar os getters associados a tais atributos para evitar os erros de compilação getters são públicos Os métodos podem ser redefinidos sem causar erros de compilação, como veremos em breve 51/67

Herença I Vamos modificar o primeiro exemplo (classe ComissionEmployee) para que seus atributos sejam protected O modificador de acesso protected permite que um membro seja acessível por membros e funções amigas da classe base e derivada. Desta forma o segundo exemplo (classe BasePlusComissionEmployee) compilará sem erros 52/67

ComissionEmployee.h I #i f n d e f COMISSION H #d e f i n e COMISSION H #i n c l u d e <s t r i n g > u s i n g s t d : : s t r i n g ; c l a s s ComissionEmployee { p r o t e c t e d : s t r i n g f i r s t N a m e ; s t r i n g lastname ; s t r i n g s o c i a l S e c u r i t y N u m b e r ; d o u b l e g r o s s S a l e s ; d o u b l e c o m i s s i o n R a t e ; p u b l i c : ComissionEmployee ( c o n s t s t r i n g &, c o n s t s t r i n g &, c o n s t s t r i n g &, d o u b l e =0.0, d o u b l e = 0. 0 ) ; ComissionEmployee ( ) ;... } ; #e n d i f 53/67

ComissionEmployee.h II A implementação da classe ComissionEmployee não muda em rigorosamente nada Internamente à classe base, nada muda se um membro é privado ou protegido. A implementação da classe BasePlusComissionEmployee também não muda Na verdade, apenas herdando da nova classe base é que ela funciona! 54/67

ComissionEmployee.h III Utilizar atributos protegidos nos dá uma leve melhoria de desempenho Não é necessário ficar chamando funções (getters e setters). Por outro lado, também nos gera dois problemas essenciais: Uma vez que não se usa getter e setter, pode haver inconsistência nos valores do atributo Nada garante que o programador que herdar fará uma validação. Uma classe derivada deve depender do serviço prestado, e não da implementação da classe base. 55/67

ComissionEmployee.h IV Quando devemos usar protected então? Quando a classe base precisa fornecer um serviço (método) apenas para classes derivadas e funções amigas, ninguém mais. Declarar membros como privados permite que a implementação da classe base seja alterada sem implicar em alteração da implementação da classe derivada; O padrão mais utilizado é atributos privados e getters e setters públicos. 56/67

ComissionEmployee.h V Vamos adequar nossas classes dos exemplos anteriores ao padrão proposto De acordo com as boas práticas de engenharia de software. A classe base volta a ter atributos privados A implementação também passa a utilizar getters e setters internamente. A classe derivada não acessa os atributos diretamente 57/67

ComissionEmployee.h I #i f n d e f COMISSION H #d e f i n e COMISSION H #i n c l u d e <s t r i n g > u s i n g s t d : : s t r i n g ; c l a s s ComissionEmployee { p r i v a t e : s t r i n g f i r s t N a m e ; s t r i n g lastname ; s t r i n g s o c i a l S e c u r i t y N u m b e r ; d o u b l e g r o s s S a l e s ; d o u b l e c o m i s s i o n R a t e ; p u b l i c : ComissionEmployee ( c o n s t s t r i n g &, c o n s t s t r i n g &, c o n s t s t r i n g &, d o u b l e =0.0, d o u b l e = 0. 0 ) ; ComissionEmployee ( ) ; v o i d s e t F i r s t N a m e ( c o n s t s t r i n g &); s t r i n g getfirstname ( ) c o n s t ;... 58/67

ComissionEmployee.cpp I #i n c l u d e " ComissionEmployee.h" ComissionEmployee : : ComissionEmployee ( c o n s t s t r i n g& f i r s t, c o n s t s t r i n g& l a s t, c o n s t s t r i n g& ssn, d o u b l e s a l e s, d o u b l e r a t e ) : f i r s t N a m e ( f i r s t ), lastname ( l a s t ), s o c i a l S e c u r i t y N u m b e r ( s s n ){ s e t G r o s s S a l e s ( s a l e s ) ; s e t C o m i s s i o n R a t e ( r a t e ) ; } d o u b l e ComissionEmployee : : e a r n i n g s ( ) c o n s t { r e t u r n g e t c o m i s s i o n R a t e ( ) g e t G r o s s S a l e s ( ) ; } 59/67

ComissionEmployee.cpp II v o i d ComissionEmployee : : p r i n t ( ) c o n s t { cout<< "\n comission employee : " << getfirstname ( ) << " " << getlastname ( ) << "\n social security number: " << g e t S o c i a l S e c u r i t y N u m b e r ( ) << "\n gross sales: " << g e t G r o s s S a l e s ( ) << "\n comission rate: " << g e t C o m i s s i o n R a t e ( ) ; } 60/67

ComissionEmployee.cpp III O construtor inicializa os atributos usando uma lista de inicialização Executado antes do próprio construtor; Em alguns casos, é obrigatório: constantes e referências. 61/67

BasePlusComissionEmployee.cpp I d o u b l e BasePlusComissionEmployee : : e a r n i n g s ( ) c o n s t { r e t u r n g e t B a s e S a l a r y ( ) + ComissionEmployee : : e a r n i n g s ( ) ; v o i d BasePlusComissionEmployee : : p r i n t ( ) c o n s t { cout << "\n base - salaried " ; ComissionEmployee : : p r i n t ( ) ; } cout << "\n base salary: " << b a s e S a l a r y ; 62/67

Exercício I Os professores de uma universidade dividem-se em 2 categorias professores em dedicação exclusiva (DE) professores horistas Professores em dedicação exclusiva possuem um salário fixo para 40 horas de atividade semanais. Professores horistas recebem um valor estipulado por hora. 63/67

Exercício II Problema pode ser resolvido através da seguinte modelagem de classes: 64/67

Exercício III Analisando a solução: Alguns atributos e métodos são iguais Como resolver? Herança! Sendo assim: Cria-se uma classe Professor, que contém os atributos e métodos comuns aos dois tipos de professor: A partir dela, cria-se duas novas classes, que representarão os professores horistas e DE. Para isso, essas classes deverão herdar os atributos e métodos declarados pela classe pai, Professor. 65/67

Exercício IV Solução 66/67

FIM 67/67