HerançaePolimorfismo
Auladehoje• PrincípiosdoparadigmaOO• Herança• Polimorfismo• Interfaces• ClassesAbstratas
Leonardo Murta Herança e Polimorfismo 2
PrincípiosdoParadigmaOO
Abstração Encapsulamento
Modularidade Hierarquia
Leonardo Murta Herança e Polimorfismo 3
Abstração• Arepresentaçãocomputacionaldoobjetorealdeveseconcentrar
nascaracterísHcasquesãorelevantesparaoproblema
Leonardo Murta Herança e Polimorfismo 4
Fonte: livro “Object-Oriented Analysis and Design with Applications”
Abstração• Sãocriadossomenteosatributosemétodosnecessáriosparao
problemaemmãos• QuaisseriamosatributosemétodosparaoobjetoCarroemcada
umadassituaçõesseguintes?– Sistemadeumalocadoradecarros– Sistemadeumarevendedoradecarros– Sistemadeumaoficinamecânica– SistemadoDETRAN
Leonardo Murta Herança e Polimorfismo 5
Encapsulamento• Oobjetodeveesconderseusdadoseosdetalhesdesua
implementação
Leonardo Murta Herança e Polimorfismo 6
Fonte: livro “Object-Oriented Analysis and Design with Applications”
Leonardo Murta Herança e Polimorfismo 7
• AtributoseMétodos– Osmétodosformamuma“cerca”emtornodosatributos– Osatributosnãodevemsermanipuladosdiretamente– Osatributossomentedevemseralteradosouconsultadosatravésdosmétodosdoobjeto
Encapsulamento
Encapsulamento
Chamadas de Métodos
Métodos Públicos
Métodos e Atributos privados Leonardo Murta Herança e Polimorfismo 8
Encapsulamento• EmumaclasseQuadrado,quaismétodosdevemserpúblicosequaisdevemserprivados?– Transladar– Ampliar– Moverponto– Girar– Adicionarponto– Calcularárea
Leonardo Murta Herança e Polimorfismo 9
Modularidade• Umsistemadeveserdecompostoemumconjuntoaltamente
coesoefracamenteacopladodeobjetos
Leonardo Murta Herança e Polimorfismo 10
Fonte: livro “Object-Oriented Analysis and Design with Applications”
Leonardo Murta Herança e Polimorfismo 11
• UmprogramaOOéumconjuntodeobjetosquecolaboramentresiparaasoluçãodeumproblema
• Objetoscolaboramatravésdechamadasdemétodosunsdosoutros
Motorista
Carro Freia
Modularidade
Modularidade• Emumsistemaacadêmico,háconceitosaluno,professor,disciplina,turmaeinscrição.Ondecolocarcadaumdosmétodosaseguir:– Exibiçãodohistóricodoaluno– Cálculodamédiadoalunoemumaturma– Obtençãodohoráriodeumaaula– Descriçãodaementadeumadisiplina– CálculodoCRdeumaluno
Leonardo Murta Herança e Polimorfismo 12
Hierarquia• Osobjetosdevemserorganizadosnosistemadeformahierárquica
Leonardo Murta Herança e Polimorfismo 13
Fonte: livro “Object-Oriented Analysis and Design with Applications”
Hierarquia• Objetosherdamatributosemétodosdosseusancestraisna
hierarquia
Leonardo Murta Herança e Polimorfismo 14
Fonte: livro “Object-Oriented Analysis and Design with Applications”
Leonardo Murta Herança e Polimorfismo 15
• Paraviabilizarahierarquiaentreobjetos,asclassessãoorganizadasemestruturashierárquicas– Aclassequeforneceuoselementosherdadoséchamadadesuperclasse
– Aclasseherdeiraéchamadadesubclasse– Asubclassepodeherdarosmétodoseatributosdesuassuperclasses
– Asubclassepodedefinirnovosatributosemétodosespecíficos
Herança
Polimorfismo• Umasubclassepoderedefinir(sobrescrever)ummétodoherdado– Estemecanismoéchamadodepolimorfismo– Opolimorfismoserealizaatravésdarecodificaçãodeumoumaismétodosherdadosporumasubclasse
– Emtempodeexecução,oJavasaberáqualimplementaçãodeveserusada
Leonardo Murta Herança e Polimorfismo 16
Leonardo Murta Herança e Polimorfismo 17
Veículo
Bicicleta Automóvel Navio Avião
Furgão Carro Caminhão Trator
Exemplodeherança
Teste da Leitura: “subclasse é um superclasse” Ex.: Carro é um Automóvel; Trator é um Veículo; ...
Exemplodeherança(relembrandoaclasseCarro)
public class Carro { private int velocidade; public Carro(int velocidadeInicial) { velocidade = velocidadeInicial; } public void acelera() { velocidade++; } public void freia() { velocidade--; } }
Leonardo Murta Herança e Polimorfismo 18
Exemplodeherança(criandoumcarrointeligente)
• Declaração: public class CarroInteligente extends Carro { public CarroInteligente(int velocidadeInicial) { super(velocidadeInicial); } public void estaciona() { // código mágico para estacionar sozinho } }
• Uso: CarroInteligente tiguan = new CarroInteligente(10); for (int i = 10; i > 0; i--) { tiguan.freia(); } tiguan.estaciona();
Leonardo Murta Herança e Polimorfismo 19
De onde veio isso?
Exemplodepolimorfismo(criandoumcarrodecorrida)
• Declaração: public class CarroCorrida extends Carro { public CarroCorrida(int velocidadeInicial) { super(velocidadeInicial); } public void acelera() { velocidade+=5; } }
• Uso: CarroCorrida f1 = new CarroCorrida(10); f1.acelera();
Leonardo Murta Herança e Polimorfismo 20
Qual a velocidade agora?
CompaHbilidadedeHpos• Qualquersubclasseécompaavelcomasuasuperclasse
– Contudo,areciprocanãoéverdadeira
Leonardo Murta Herança e Polimorfismo 21
Carro
CarroInteligente
Carro c = new CarroInteligente(20); c.acelera(); c.freia();
CarroInteligente c = new Carro(20); c.acelera(); c.freia(); c.estaciona();
✓
✗
HerançaemJava• Umaclassesópodeherdardeumaoutraclasse(herançasimples)
• Casonãosejadeclaradaherança,aclasseherdadaclasseObject– EladefineométodotoString(),queretornaarepresentaçãoemStringdoobjeto
– QualquersubclassepodesobrescreverométodotoString()pararetornaroqueeladeseja.
• VejaosdemaismétodosdaclasseObjectemhcps://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
Leonardo Murta Herança e Polimorfismo 22
Exercíciodeherança• Emumsistemadeloja,há3Hposdeusuário:gerente,funcionárioecliente.Todousuáriotemnomeesenha.Oclientepossui,alémdonomeesenha,outrosdadoscadastrais.Ofuncionáriopossuimétodosrelacionadosavendadeprodutos.Ogerentepodefazertudoqueofuncionáriopodeetambémfechamentodocaixa.Comoéahierarquiadeherançadessesistemanoqueserefereacontroledeusuários?
Leonardo Murta Herança e Polimorfismo 23
Interfaces• Tipoespecialdeclasse,quenãotemimplementação
– Umainterfacedefineumprotocolo– Classespodemimplementarumaoumaisinterfaces
• Umainterfaceéumcontratoassinadoporumaclasse– Ainterfacedefineasresponsabilidadesdaclasse– Asresponsabilidadessãomapeadasemmétodos– Aclassequeimplementaainterfaceimplementaosmétodos– Ainterfacecontémsomenteassinaturademétodoseconstantes
Leonardo Murta Herança e Polimorfismo 24
Interfaces• Adefiniçãodeumainterfaceésimilaradeumaclasse
– UHlizamosapalavrareservadainterface– Apalavrareservadadeveserseguidadonomedainterface– Umainterfacepodeherdardeoutrasinterfaces(extends)– Ainterfacepossuiapenasmétodossemimplementação(abstratos)econstantes
public interface Taxavel {
int ANO_INICIO = 1996; double calculaTaxa ();
}
Leonardo Murta Herança e Polimorfismo 25
Fica implícito que é public, static e final
Exemplopublic class CarroImportado extends Carro implements Taxavel
{
<atributos da CarroImportado>
<métodos da CarroImportado>
<métodos implementados da interface Taxavel> }
Leonardo Murta Herança e Polimorfismo 26
Programaçãoorientadaainterfaces
Leonardo Murta Herança e Polimorfismo 27
public interface Stack { public Object pop(); public void push(Object o); public int size(); }
Implementação
Uso
Programaçãoorientadaainterfaces
Leonardo Murta Herança e Polimorfismo 28
public interface Stack { public Object pop(); public void push(Object o); public int size(); }
Implementação
adicionaPedido(Stack s) { Pedido p = new Pedido(...); s.push(p); } Desconhece a
implementação
Programaçãoorientadaainterfaces
Leonardo Murta Herança e Polimorfismo 29
public interface Stack { public Object pop(); public void push(Object o); public int size(); }
Uso
public class MyStack implements Stack { public void push(Object o) { ...
Desconhece o uso
ClassesAbstratas• Seumaclassepossuialgummétodosemimplementação(abstrato),omodificadorabstractdeveprecedersuadeclaração
abstract class Carro {
<atributos da classe Carro> <métodos comuns da classe Carro>
<métodos abstratos da classe Carro>
}
Leonardo Murta Herança e Polimorfismo 30
ClassesAbstratas• Nãopodemserusadasparainstanciarobjetos• Devemservistascomotemplatesparasubclassesqueirãodarumaimplementaçãoaosmétodosabstratos
• Exemplo:– ClasseabstrataPagamentotemummétodoabstratopaga(...)
– ClassesconcretasPagamentoVisa,PagamentoCheque,PagamentoDinheirodãocomportamentoaométodopaga(...)
Leonardo Murta Herança e Polimorfismo 31
ClassesAbstratas
Leonardo Murta Herança e Polimorfismo 32
public abstract class Pagamento { ... public abstract void paga(...); }
public class PagamentoVisa extends Pagamento { ... public void paga(...) { // código de pagamento com cartão Visa } }
Exercício• RefazeroexercíciodaAgenda,quelistaoscontatosordenadospornomeeporidade– FazerumaclasseabstrataOrdenadorcomalógicadeordenação,porémchamandoummétodoabstratocompara(Pessoa,Pessoa)
– Criarduasclassesextras,OrdenadorNomeeOrdenadorIdade,queherdamdeOrdenadoreimplementamométodoabstratocompara(Pessoa,Pessoa)
– Instanciaroordenadorapropriadoparalistaroscontatospornomeeporidade
Leonardo Murta Herança e Polimorfismo 33
Exercício• FaçaumaclasseAnimalcom
ummétodoabstrato“fala”• FaçaasclassesHomem,Cãoe
Gato,herdandodeanimal,redefinindoométodo“fala”pararetornar“Oi”,“Auau”e“Miau”,respecHvamente
• Crieumvetorde10AnimaiseinstancieHomens,CãeseGatosnessevetor
• Façaumloopportodososanimaisdovetor,pedindoparaelesfalarem
Leonardo Murta Herança e Polimorfismo 34
Animal
Homem Cão Gato
HerançaePolimorfismo