SlideShare uma empresa Scribd logo
Aula 2Polimorfismo de subtiposAnálise, desenho e implementação
Na aula anterior …Introdução à programação orientada por objectosClasses, objectos e referências (revisão)Modularização em pacotesOrganização em ficheiros e directórios2009/2010Programação Orientada por Objectos2
EmployeepublicclassEmployee {privateStringname;    privateStringssn;publicEmployee(final Stringname, final Stringssn) {this.name = name;this.ssn = ssn;    }publicStringgetName() {returnname;    }publicStringgetSsn() {returnssn;    }    @OverridepublicStringtoString() {return "(" + getName() + ", " + getSsn() + ")";    }}2009/2010Programação Orientada por Objectos3Que é isto? Veremos à frente…
Generalização (relação)2009/2010Programação Orientada por Objectos4EmployeeGeneralizaçãoEspecializaçãoSupervisorRelação de generalização Um Supervisoré umEmployee.
 Um Employeepode ser umSupervisor.Herançapublic class Supervisor extends Employee {    private int level;    public Supervisor(final String name,                       final String ssn,                      final int level) {        …    }    public intgetLevel() {        return level;    }    @Override    public String toString() {        return "(" + getName() + ", " + getSsn() + ", "                + getLevel() + ")";    }}2009/2010Programação Orientada por Objectos5Um Supervisor é um Employee.Novo  método específico da classe Supervisor.Sobrepõe-se ao método com a mesma assinatura na classe base Employee.
Generalização (relação)2009/2010Programação Orientada por Objectos6Classe base ou superclasse.EmployeeGeneralizaçãoEspecializaçãoSupervisorClasse derivada ou subclasse.
HerançaClasse derivada deriva da classe base(subclasse deriva da superclasse)Membros são herdados e mantêm categoria de acessoRelação é um – Referências do tipo da classe base podem referir-se a objectos de classes derivadasExemploSupervisor supervisor = new Supervisor("Guilhermina",                                       "123456789", 3);Employee employee = new Supervisor("Felisberto",                                   "987654321", 5);2009/2010Programação Orientada por Objectos7
SobreposiçãoMétodo de classe derivada pode sobrepor-se a método de classe baseSobreposição é especializaçãoRegrasMesma assinatura e tipo de devolução compatívelMétodo na classe base não privado e não finalMétodo na classe derivada com acessibilidade igual ou superior2009/2010Programação Orientada por Objectos8Na realidade tem de ser co-variante, ou seja, o tipo de devolução do método na classe derivada deriva de (ou é igual a) o tipo de devolução na classe base.Um método final não pode ser especializado.
Categorias de acesso (de novo)Características ou membros podem serprivate – acesso apenas por outros membros da mesma classepackage-private (sem qualificador) – adicionalmente, acesso por membros de classes do mesmo pacoteprotected – adicionalmente, acesso por membros de classes derivadaspublic –  acesso universal2009/2010Programação Orientada por Objectos9Acessibilidade crescente
Interfaces de uma classePrópria classeMembros da classe e membros não privados de classes baseClasse do mesmo pacoteMembros não privados da classe ou suas basesClasse derivadaMembros protegidos ou públicos da classe ou suas basesOutra classeMembros públicos da classe ou suas bases2009/2010Programação Orientada por Objectos10
ExemploVector<Employee> employees =    new Vector<Employee>();employees.add(new Employee("João Maria",                           "123456789"));employees.add(new Supervisor("Ana Maria",                             "987654321", 4));…for (Employee employee : employees)    out.println(employee.toString());2009/2010Programação Orientada por Objectos11Invocação da operação toString().Qual o método toString() executado?
Organização2009/2010Programação Orientada por Objectos1201: Employee: Supervisoremployees : «ref» Vector<Employee>: Vector<Employee>: «ref» Employee: «ref» Employeename = “João Maria”ssn  = “123456789”name = “Ana Maria”ssn  = “987654321”level = 4Possível porque a classe Supervisor deriva da classe Employee, ou seja, possível porque um Supervisor é (sempre também) um Employee.
Resultado2009/2010Programação Orientada por Objectos13O resultado depende do tipo do objecto e não do tipo da referência! Isso acontece porque o método toString é polimórfico ou virtual._(João Maria, 123456789)_(João Maria, 123456789)(Ana Maria, 987654321, 4)_
PolimorfismoCapacidade de um objecto tomar várias formasA forma descrita pela classe a que pertenceAs formas descritas pelas classes acima na hierarquia a que pertenceObjecto pode ser referenciado por referências do tipo da classe a que pertence ou de classes acima na hierarquia (mais genéricas)2009/2010Programação Orientada por Objectos14
Princípio da substituição de LiskovSeja p(x) uma propriedade demonstrável acerca de objectos x do tipo B. Então, p(y) também deve verificar-se para objectos y do tipo D onde S é um subtipo de B.Barbara H. Liskov e  Jeannette M. Wing, “A Behavioral Notion of Subtyping”, ACM Transactions m Programming Languages and Systems, Volume 16, N.º 6, Novembro de 1994, pp. 1811-1841.Ver http://en.wikipedia.org/wiki/Liskov_substitution_principle.2009/2010Programação Orientada por Objectos15Tem de ser o programador a garantir que este princípio se verifica!
O que aparece na consola?Supervisor supervisor = new Supervisor("Guilhermina",                                        "123456789", 3);Employee anEmployee = new Supervisor("Felisberto",                                      "987654321", 5);Employee anotherEmployee = new Employee("Elvira",                                        "111111111");out.println(supervisor.toString());out.println(anEmployee.toString());out.println(anotherEmployee.toString());2009/2010Programação Orientada por Objectos16_(Guilhermina, 123456789, 3)_(Guilhermina, 123456789, 3)(Felisberto, 987654321, 5)_(Guilhermina, 123456789, 3)(Felisberto, 987654321, 5)(Elvira, 111111111)_
Polimorfismo: operações e métodosUma operação polimórfica ou virtual pode ter várias implementaçõesA uma implementação de uma operação chama-se métodoA uma operação polimórfica podem corresponder diferentes métodos, cada um em sua classeTodas as operações em Java são polimórficas, com excepção das qualificadas com privateUma classe é polimórfica se tiver pelo menos uma operação polimórfica2009/2010Programação Orientada por Objectos17
Polimorfismo: operações e métodosInvoca-se uma operação sobre um objecto de uma classe para atingir um objectivoInvocação de uma operação leva à execução do método apropriado, ou seja, leva à execução da implementação apropriada da operaçãoPolimorfismoInvocação de uma operação pode levar à execução de diferentes métodosMétodo efectivamente executado depende da classe do objecto sobre o qual a operação é invocadaMétodo executadonão depende do tipo da referência para o objecto utilizado2009/2010Programação Orientada por Objectos18Simplificação… invocações internas podem levar à execução de métodos privados directamente.
A classe Objectpublic class Employee extends Object {    private String name;    private String ssn;    public Employee(final String name, final String ssn) {        this.name = name;        this.ssn = ssn;    }    public String getName() {        return name;    }    public String getSsn() {        return ssn;    }    @Override    public String toString() {        return "(" + getName() + ", " + getSsn() + ")";    }}2009/2010Programação Orientada por Objectos19Se uma classe não derivar explicitamente de outra, derivará implicitamente da classe Object, que está no topo da hierarquia de classes do Java.Agora percebe-se! A classe Object declara a operação toString() e define imediatamente um correspondente  método. Esta é uma sua especialização.
Ligação estática vs. dinâmicaLigação (binding)Associação entre a invocação de uma operação e a execução de um métodoLigação estática Operações não polimórficas, invocações através de superAssociação estabelecida em tempo de compilaçãoLigação dinâmicaOperações polimórficasAssociação estabelecida apenas em tempo de execução2009/2010Programação Orientada por Objectos20Que é isto? Veremos à frente…
Métodos finaisClasse derivada não é obrigada a fornecer método para operação da classe baseClasse base pode proibir às classes derivadas a sobreposição de um seu método, que se dirá ser um método finalRazão para um método ser final:Programador que forneceu o método na classe base entendeu que classes derivadas não deveriam poder especializar o modo de funcionamento desse método2009/2010Programação Orientada por Objectos21
Uma ajudinha da classe basepublic class Base {    public String className() {        return "Base";    }}public class Derived extends Base {    @Override    public String className() {        return “Derived”;    }    public void testCalls() {        Base base = (Base)this;        out.println("Through this:  " + this.className());        out.println("Through base:  " + base.className());        out.println("Through super: " + super.className());    }}2009/2010Programação Orientada por Objectos22_Throughthis:  Derived_Throughthis:  DerivedThrough base:  Derived_Throughthis:  DerivedThrough base:  DerivedThrough super: Base_
Análise: conceitosVeículoMotocicloAutomóvelHonda NX 650Audi TT2009/2010Programação Orientada por Objectos23VehicleMotorcycleCarHondaNx650AudiTtAnálise inicial pode resultar num dicionário ou glossário do domínio.
Análise: relaçõesUm Automóvel é um VeículoUm Motociclo é um VeículoUma Honda NX 650 é um MotocicloUm Audi TT é um Automóvel2009/2010Programação Orientada por Objectos24Pode refinar-se o dicionário ou glossário do domínio, acrescentando as relações entre conceitos.VehicleCarMotorcycleAudiTtHondaNx650
Desenho2009/2010Programação Orientada por Objectos25VehiclePropriedades……OperaçõesCarMotorcycle…………AudiTtHondaNx650…………
Implementaçãopublic class Vehicle {     …}public class Car extends Vehicle {     …}public class Motorcycle extends Vehicle {     …}public class HondaNx650 extends Motorcycle {     …}public class AudiTt extends Car {     …}2009/2010Programação Orientada por Objectos26
Conceitos abstractos e concretosConceito abstracto – Sem instâncias no domínio em causaConceito concreto – Com instâncias no domínio em causaConceitos identificados são abstractos ou concretos?Dependendo do domínio e seu modelo… Veículo e Automóvel abstractos; Audi TT concretoVeículo abstracto; Automóvel e Audi TT concretos2009/2010Programação Orientada por Objectos27
Análise e desenhoHipótese 1Hipótese 22009/2010Programação Orientada por Objectos28VehicleVehicleCarCarMotorcycleMotorcycleÉ boa prática que as classes concretas sejam folhas na hierarquia.AudiTtHondaNx650As classes abstractas, correspondentes aos conceitos abstractos, têm o nome em itálico.
Implementação: hipótese 1public abstract class Vehicle {     …}public class Car extends Vehicle {     …}public class Motorcycle extends Vehicle {     …}2009/2010Programação Orientada por Objectos29
Implementação: hipótese 2public abstract class Vehicle {     …}public abstract class Car extends Vehicle {     …}public abstract class Motorcycle extends Vehicle {     …}public class HondaNx650 extends Motorcycle {     …}public class AudiTt extends Car {     …}2009/2010Programação Orientada por Objectos30
Caixa de ferramentas: Positionpublic class Position {    private double x;    private double y;    public Position(final double x, final double y) {        this.x = x;        this.y = y;    }    public final double getX() {        return x;    }    public final double getY() {        return y;    }}2009/2010Programação Orientada por Objectos31
Caixa de ferramentas: Sizepublic class Size {    private double width;    private double height;    public Size(final double width,                final double height) {        this.width = width;        this.height = height;    }    public final double getWidth() {        return width;    }    public final double getHeight () {        return height;    }}2009/2010Programação Orientada por Objectos32Apesar de ter também dois atributos do tipo double, um Size não é uma Position.
Caixa de ferramentas: Boxpublic class Box {    private Position topLeftCornerPosition;    private Size size;    public Box(final Position topLeftCornerPosition,               final Size size) {        this.topLeftCornerPosition = topLeftCornerPosition;        this.size = size;    }    public final Position getTopLeftCornerPosition() {        return position;    }    public final Size getSize() {        return size;    }}2009/2010Programação Orientada por Objectos33Uma Box não é nem uma Position, nem um Size, mas é composta por uma Position e por um Size.
Análise: conceitosFiguraForma (abstrato)CírculoQuadrado2009/2010Programação Orientada por Objectos34FigureShapeCircleSquare
Análise: relaçõesUma Figura é composta de FormasUm Círculo é uma FormaUm Quadrado é uma Forma2009/2010Programação Orientada por Objectos35FigureShapeRelação de composição.CircleSquare
Desenho2009/2010Programação Orientada por Objectos36FigureShape…………CircleSquare…………
Implementaçãopublic class Figure {    private Vector<Shape> shapes;    …}public abstract class Shape {     …}public class Circle extends Shape {     …}public class Square extends Shape {     …}2009/2010Programação Orientada por Objectos37
Implementação: Shapepublic abstract class Shape {    private Position position;    public Shape(final Position position) {this.position = position;    }    public final Position getPosition() {        return position;	    }    public abstract double getArea();    public abstract double getPerimeter();    public abstract Box getBoundingBox();    public void moveTo(final Position newPosition) {        position = newPosition;    }}2009/2010Programação Orientada por Objectos38Qual a área de uma “forma”??Operações abstractas, ou seja, operações sem qualquer implementação disponível até este nível da hierarquia.
Implementação: Circlepublic class Circle extends Shape {    private double radius;    public Circle(final Position position,                  final double radius) {        super(position);this.radius = radius;    }    public final double getRadius() {         return radius;    }    …2009/2010Programação Orientada por Objectos39Um Circle é uma Shape e a classe Circle herda a implementação da classe Shape.É necessário apenas um atributo adicional, correspondente a uma das duas propriedades de um círculo (o raio), já que a posição do centro é herdada da classe Shape.Uma ajudinha da classe base…
Implementação: Circle    …    @Override    public double getArea() {        return Math.PI * getRadius() * getRadius();    }    @Override    public double getPerimeter() {        return 2.0 * Math.PI * getRadius();    }    @Override    public Box getBoundingBox() {        return new Box(            new Position(getPosition().getX() - getRadius(),getPosition().getY() - getRadius()),            new Size(2.0 * getRadius(), 2.0 * getRadius())        );    }}2009/2010Programação Orientada por Objectos40Qual a área de um círculo? Fácil, π×r2.Fornece-se implementações, ou seja, métodos, para cada uma das operações abstractas da classe Shape.
Desenho pormenorizado2009/2010Programação Orientada por Objectos41ShapeFigure- position : Position + Shape(position : Position)+ getPosition() : Position+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : Box+ moveTo(newPosition : Position)CircleSquare- radius : double+ Circle(position : Position, radius : double)+ getRadius() : double+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : Box
Desenho pormenorizado2009/2010Programação Orientada por Objectos42ShapeFigure- position : Position «constructors»+ Shape(position : Position)«inspectors»+ getPosition() : Position+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : BoxCircleSquare- radius : double«constructors»+ Circle(position : Position, radius : double)«modifiers»+ moveTo(newPosition : Position)«inspectors»+ getRadius() : double+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : Box
Classes abstractasUma operação com qualificador abstract é uma simples declaração da operaçãoUma operação sem qualificador abstract inclui também a definição de um método correspondente, que a implementaUma classe com uma operação abstracta tem de ser uma classe abstractaUma classe é abstracta se tiver o qualificador abstract2009/2010Programação Orientada por Objectos43
Classes abstractasUma classe não abstracta diz-se uma classe concretaUma classe abstracta não pode ser instanciada, i.e., não se podem construir objectos de uma classe abstractaUma classe derivada directamente de uma classe abstracta só poderá ser concreta se implementar cada uma das operações abstractas da classe abstracta2009/2010Programação Orientada por Objectos44
A reter...Generalização – Relação entre duas classes, base e derivada, em que a derivada especializa a base, que por sua vez generaliza a derivadaPolimorfismo – Um mesmo objecto pode ser visto de formas diferentes consoante o tipo da referência usada para o referenciar: uma mesma referência pode referenciar objectos de diferentes classesOperação abstracta – Uma operações declarada numa dada classe mas não implementada nessa classeClasse abstracta – Uma classe que não pode ser instanciada, i.e., da qual não existem objectos; usualmente as classes abstractas têm pelo menos uma operação abstracta2009/2010Programação Orientada por Objectos45
A ler para as próximas aulas ...Capítulos 1 a 10 e 16 do livro:Y. Daniel Liang, Introduction to Java Programming, 7.ª edição, Prentice-Hall, 2008.ISBN: 978-0-13-605966-02009/2010Programação Orientada por Objectos46

Mais conteúdo relacionado

PPTX
Programação Orientada por Objectos - Aula 1
PDF
Diagrama de Classe
PPTX
8. Classes e instâncias; Cadeias de caracteres – Fundamentos de Programação
PPTX
Fundamentos de Padrões de Projeto de Software
PPT
Integração de Tecnologias
PDF
Curso de Java (Parte 3)
PPTX
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
PPTX
12. Paradigmas da programação; Programação orientada por objectos; Pacotes – ...
Programação Orientada por Objectos - Aula 1
Diagrama de Classe
8. Classes e instâncias; Cadeias de caracteres – Fundamentos de Programação
Fundamentos de Padrões de Projeto de Software
Integração de Tecnologias
Curso de Java (Parte 3)
13. Polimorfismo de subtipos; Análise, desenho e implementação – Fundamentos ...
12. Paradigmas da programação; Programação orientada por objectos; Pacotes – ...

Mais procurados (20)

PPTX
4. Introdução à linguagem de programação Java – Fundamentos de Programação
PPT
Padrões de Projeto
PDF
Curso de Java (Parte 4)
PDF
PDF
Programação orientada a objetos em delphi
PDF
Introdução a Banco de Dados (Parte 3)
PPTX
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
PDF
Conceitos Básicos de OO e Java
PPTX
6. Caracteres; Tipos char e int; Tipos de valor e de referência – Fundamentos...
PDF
Java programação orientada a objetos
PPT
Aula5
PDF
Exercitando modelagem em UML
ODP
Paradigma Orientado a Objeto
PDF
Curso de Java (Parte 2)
PDF
Programação Orientada a Objetos - 001
PDF
Intro padroesprojetoadaptertemplateobserver
PDF
POO - 01 - Introdução ao Paradigma Orientado a Objetos
PDF
Orientação a Objetos no Delphi - Por onde começar (I)
PDF
Programação orientada a objetos – II
4. Introdução à linguagem de programação Java – Fundamentos de Programação
Padrões de Projeto
Curso de Java (Parte 4)
Programação orientada a objetos em delphi
Introdução a Banco de Dados (Parte 3)
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
Conceitos Básicos de OO e Java
6. Caracteres; Tipos char e int; Tipos de valor e de referência – Fundamentos...
Java programação orientada a objetos
Aula5
Exercitando modelagem em UML
Paradigma Orientado a Objeto
Curso de Java (Parte 2)
Programação Orientada a Objetos - 001
Intro padroesprojetoadaptertemplateobserver
POO - 01 - Introdução ao Paradigma Orientado a Objetos
Orientação a Objetos no Delphi - Por onde começar (I)
Programação orientada a objetos – II
Anúncio

Destaque (20)

PDF
Aula 2 Ferramentas De Desenho
PPT
Aula 7 projeções ortog. a
PPTX
Programação Orientada por Objectos - Aula 6
PPTX
Programação Orientada por Objectos - Aula 7
PPTX
Introdução à programação orientada para aspectos
PPTX
7. Arrays multidimensionais; Estratégias de resolução de problemas – Fundamen...
PPTX
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
PPTX
Programação Orientada por Objectos - Aula 3
PPTX
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
PPT
Aula 8 (a) p.baixa
PDF
1 apres exercicios_solidos-vistas-axonos_conceitos_projetor
PPTX
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
PPTX
2. Programação e resolução de problemas; Algoritmos; Snap! – Fundamentos de P...
PDF
2 f info_exercicios_solidos-vistas-axonos_conceitos
PPTX
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
PPTX
1. Computador; Línguas naturais; Linguagens de Programação; Algoritmo e progr...
PPTX
Aula de desenho 2 vistas
PPTX
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
PPTX
Programação Orientada por Objectos - Aula 5
PDF
1.desenho projetivo e_perspectivas
Aula 2 Ferramentas De Desenho
Aula 7 projeções ortog. a
Programação Orientada por Objectos - Aula 6
Programação Orientada por Objectos - Aula 7
Introdução à programação orientada para aspectos
7. Arrays multidimensionais; Estratégias de resolução de problemas – Fundamen...
3. Funções/repórteres e listas em Snap!; Utilização de variáveis – Fundamento...
Programação Orientada por Objectos - Aula 3
11. Enumerações; Instrução switch; Limitações dos inteiros – Fundamentos de P...
Aula 8 (a) p.baixa
1 apres exercicios_solidos-vistas-axonos_conceitos_projetor
5. Atribuições especiais; Arrays; Tipos de ciclos; Classes-pacote – Fundament...
2. Programação e resolução de problemas; Algoritmos; Snap! – Fundamentos de P...
2 f info_exercicios_solidos-vistas-axonos_conceitos
10. Encapsulação; Cópia de instâncias; Igualdade de instâncias – Fundamentos ...
1. Computador; Línguas naturais; Linguagens de Programação; Algoritmo e progr...
Aula de desenho 2 vistas
14. Interfaces; Listas e cadeias ligadas; Iteradores – Fundamentos de Program...
Programação Orientada por Objectos - Aula 5
1.desenho projetivo e_perspectivas
Anúncio

Semelhante a Programação Orientada por Objectos - Aula 2 (20)

PDF
Aula 3 -_fundamentos_sobre_aoo
ODP
Orientação a Objetos (3)
ODP
Orientação a objetos (tecnologias)
PPTX
Programação Orientado a Objetos
PDF
encapsulamento-heranca-e-polimorfismo.pdf
PDF
SLIDES - AULA 3 - CLASSES E OBJETOS EM JAVA - Material de Cleyton Souza - IFPB
PDF
POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4)
PPT
Programação Orientada a Objeto(POO)
PPT
Java Básico :: Orientação a objetos
PPTX
3.1 orientação objetos
PPT
Apresentação programação orientada à objetos
PPTX
AULA DIA 22-2024 - PROGRAMACAO ORIENTADA A OBJETOS EM JAVA.pptx
PDF
03 poo
PPTX
Poo (1)
PDF
Aula3-POO-ConceitosBasicos.pdf
PDF
05 poo-ii
PDF
Programação OO - Java
PPTX
PPSX
Java & orientação a objetos
PPT
Curso Java Basico
Aula 3 -_fundamentos_sobre_aoo
Orientação a Objetos (3)
Orientação a objetos (tecnologias)
Programação Orientado a Objetos
encapsulamento-heranca-e-polimorfismo.pdf
SLIDES - AULA 3 - CLASSES E OBJETOS EM JAVA - Material de Cleyton Souza - IFPB
POO - Unidade 1 (parte 2) - Orientação a Objetos com Java e UML (versão 4)
Programação Orientada a Objeto(POO)
Java Básico :: Orientação a objetos
3.1 orientação objetos
Apresentação programação orientada à objetos
AULA DIA 22-2024 - PROGRAMACAO ORIENTADA A OBJETOS EM JAVA.pptx
03 poo
Poo (1)
Aula3-POO-ConceitosBasicos.pdf
05 poo-ii
Programação OO - Java
Java & orientação a objetos
Curso Java Basico

Mais de Manuel Menezes de Sequeira (15)

PPTX
Semana 10: Encapsulação, cópia de instâncias, igualdade de instâncias
PPTX
Semana 9: toString, classes, instâncias e objectos, Scanner
PPTX
Semana 8: Classes e instâncias, cadeias de caracteres
PPTX
Semana 6: Matrizes multidimensionais, estratégias de resolução de problemas
PPTX
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
PPTX
Semana 4: Atribuições especiais, matrizes, ciclos, classes pacote
PPTX
Semana 3: Introdução à linguagem de programação Java
PPTX
Semana 2: Funções e listas, variáveis
PPTX
Semana 1: Programação como arte de resolver problemas, algoritmos e problema...
PPTX
Semana 0: Computadores, linguagens e linguagens de programação, Noções de al...
PPTX
Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)
PPTX
Eng.ª do Software - 10. Testes de software
PPTX
Eng.ª do Software - 9. Verificação e validação
PPTX
Eng.ª do Software - 8. Desenho de interfaces com o utilizador
PPTX
Eng.ª do Software - 7. Desenho arquitectónico
Semana 10: Encapsulação, cópia de instâncias, igualdade de instâncias
Semana 9: toString, classes, instâncias e objectos, Scanner
Semana 8: Classes e instâncias, cadeias de caracteres
Semana 6: Matrizes multidimensionais, estratégias de resolução de problemas
Semana 5: Caracteres, tipos char e int, tipos de valor vs. tipos de referência
Semana 4: Atribuições especiais, matrizes, ciclos, classes pacote
Semana 3: Introdução à linguagem de programação Java
Semana 2: Funções e listas, variáveis
Semana 1: Programação como arte de resolver problemas, algoritmos e problema...
Semana 0: Computadores, linguagens e linguagens de programação, Noções de al...
Semana 11: Enumerações, limites de tipos numéricos (gama e precisão)
Eng.ª do Software - 10. Testes de software
Eng.ª do Software - 9. Verificação e validação
Eng.ª do Software - 8. Desenho de interfaces com o utilizador
Eng.ª do Software - 7. Desenho arquitectónico

Último (20)

PPTX
Ocupação e transformação dos territórios.pptx
PPTX
Educação Especial na perspectiva Inclusiva 02.pptx
PPT
Elementos constituintes do esquema argumentativo (tese, argumento, tema, pont...
PDF
HORÁRIO GERAL SIGAA 2025_PRÉVIA_SIGAA-1.pdf
PDF
edital-de-chamamento-publico-no-3-2025.pdf
PPSX
4. A Cultura da Catedral - HistóriaCArtes .ppsx
PDF
[Slides] A Literatura no ENEM 2017 (1).pdf
PPT
YY2015MM3DD6HH12MM42SS3-Organiza__o do Estado ILP.ppt
PPTX
Fronteiras e soberania..........................pptx
PPT
Caderno de Boas Práticas dos Professores Alfabetizadores.ppt
PPT
br-a-1692841480-passeio-pela-historia-da-arte-apresentacao-em-powerpoint_ver_...
PPTX
5. A cultura do mundo virtual - globalidade.pptx
PPTX
2. A Cultura do Salão - o fim das trevas.pptx
DOC
PPP 2024 (2) (2) feito EM REELABORAÇÃO MORENA ( ABRIL 2024).doc
PDF
EXPRESSÕES IDIOMÁTICAS - LÍNGUA PORTUGUESA
PDF
O retorno a origem (islã Islamismo)
PPT
NÚCLEO INTERFÁSICO E DIVISÃO CELULAR.ppt
PPT
1ª Telefonia Fixa Padrao Novo Jailton 2012_22.ppt
PPTX
INTRODUÇÃO AO ESTUDO DA ANATOMIA HUMANA [Salvo automaticamente].pptx
PDF
Historia-da-Psicologia-Rumos-e-percursos.pdf
Ocupação e transformação dos territórios.pptx
Educação Especial na perspectiva Inclusiva 02.pptx
Elementos constituintes do esquema argumentativo (tese, argumento, tema, pont...
HORÁRIO GERAL SIGAA 2025_PRÉVIA_SIGAA-1.pdf
edital-de-chamamento-publico-no-3-2025.pdf
4. A Cultura da Catedral - HistóriaCArtes .ppsx
[Slides] A Literatura no ENEM 2017 (1).pdf
YY2015MM3DD6HH12MM42SS3-Organiza__o do Estado ILP.ppt
Fronteiras e soberania..........................pptx
Caderno de Boas Práticas dos Professores Alfabetizadores.ppt
br-a-1692841480-passeio-pela-historia-da-arte-apresentacao-em-powerpoint_ver_...
5. A cultura do mundo virtual - globalidade.pptx
2. A Cultura do Salão - o fim das trevas.pptx
PPP 2024 (2) (2) feito EM REELABORAÇÃO MORENA ( ABRIL 2024).doc
EXPRESSÕES IDIOMÁTICAS - LÍNGUA PORTUGUESA
O retorno a origem (islã Islamismo)
NÚCLEO INTERFÁSICO E DIVISÃO CELULAR.ppt
1ª Telefonia Fixa Padrao Novo Jailton 2012_22.ppt
INTRODUÇÃO AO ESTUDO DA ANATOMIA HUMANA [Salvo automaticamente].pptx
Historia-da-Psicologia-Rumos-e-percursos.pdf

Programação Orientada por Objectos - Aula 2

  • 1. Aula 2Polimorfismo de subtiposAnálise, desenho e implementação
  • 2. Na aula anterior …Introdução à programação orientada por objectosClasses, objectos e referências (revisão)Modularização em pacotesOrganização em ficheiros e directórios2009/2010Programação Orientada por Objectos2
  • 3. EmployeepublicclassEmployee {privateStringname;   privateStringssn;publicEmployee(final Stringname, final Stringssn) {this.name = name;this.ssn = ssn; }publicStringgetName() {returnname; }publicStringgetSsn() {returnssn; } @OverridepublicStringtoString() {return "(" + getName() + ", " + getSsn() + ")"; }}2009/2010Programação Orientada por Objectos3Que é isto? Veremos à frente…
  • 4. Generalização (relação)2009/2010Programação Orientada por Objectos4EmployeeGeneralizaçãoEspecializaçãoSupervisorRelação de generalização Um Supervisoré umEmployee.
  • 5. Um Employeepode ser umSupervisor.Herançapublic class Supervisor extends Employee {    private int level;    public Supervisor(final String name, final String ssn, final int level) { … }    public intgetLevel() { return level; } @Override    public String toString() { return "(" + getName() + ", " + getSsn() + ", " + getLevel() + ")"; }}2009/2010Programação Orientada por Objectos5Um Supervisor é um Employee.Novo método específico da classe Supervisor.Sobrepõe-se ao método com a mesma assinatura na classe base Employee.
  • 6. Generalização (relação)2009/2010Programação Orientada por Objectos6Classe base ou superclasse.EmployeeGeneralizaçãoEspecializaçãoSupervisorClasse derivada ou subclasse.
  • 7. HerançaClasse derivada deriva da classe base(subclasse deriva da superclasse)Membros são herdados e mantêm categoria de acessoRelação é um – Referências do tipo da classe base podem referir-se a objectos de classes derivadasExemploSupervisor supervisor = new Supervisor("Guilhermina", "123456789", 3);Employee employee = new Supervisor("Felisberto", "987654321", 5);2009/2010Programação Orientada por Objectos7
  • 8. SobreposiçãoMétodo de classe derivada pode sobrepor-se a método de classe baseSobreposição é especializaçãoRegrasMesma assinatura e tipo de devolução compatívelMétodo na classe base não privado e não finalMétodo na classe derivada com acessibilidade igual ou superior2009/2010Programação Orientada por Objectos8Na realidade tem de ser co-variante, ou seja, o tipo de devolução do método na classe derivada deriva de (ou é igual a) o tipo de devolução na classe base.Um método final não pode ser especializado.
  • 9. Categorias de acesso (de novo)Características ou membros podem serprivate – acesso apenas por outros membros da mesma classepackage-private (sem qualificador) – adicionalmente, acesso por membros de classes do mesmo pacoteprotected – adicionalmente, acesso por membros de classes derivadaspublic – acesso universal2009/2010Programação Orientada por Objectos9Acessibilidade crescente
  • 10. Interfaces de uma classePrópria classeMembros da classe e membros não privados de classes baseClasse do mesmo pacoteMembros não privados da classe ou suas basesClasse derivadaMembros protegidos ou públicos da classe ou suas basesOutra classeMembros públicos da classe ou suas bases2009/2010Programação Orientada por Objectos10
  • 11. ExemploVector<Employee> employees = new Vector<Employee>();employees.add(new Employee("João Maria", "123456789"));employees.add(new Supervisor("Ana Maria", "987654321", 4));…for (Employee employee : employees) out.println(employee.toString());2009/2010Programação Orientada por Objectos11Invocação da operação toString().Qual o método toString() executado?
  • 12. Organização2009/2010Programação Orientada por Objectos1201: Employee: Supervisoremployees : «ref» Vector<Employee>: Vector<Employee>: «ref» Employee: «ref» Employeename = “João Maria”ssn = “123456789”name = “Ana Maria”ssn = “987654321”level = 4Possível porque a classe Supervisor deriva da classe Employee, ou seja, possível porque um Supervisor é (sempre também) um Employee.
  • 13. Resultado2009/2010Programação Orientada por Objectos13O resultado depende do tipo do objecto e não do tipo da referência! Isso acontece porque o método toString é polimórfico ou virtual._(João Maria, 123456789)_(João Maria, 123456789)(Ana Maria, 987654321, 4)_
  • 14. PolimorfismoCapacidade de um objecto tomar várias formasA forma descrita pela classe a que pertenceAs formas descritas pelas classes acima na hierarquia a que pertenceObjecto pode ser referenciado por referências do tipo da classe a que pertence ou de classes acima na hierarquia (mais genéricas)2009/2010Programação Orientada por Objectos14
  • 15. Princípio da substituição de LiskovSeja p(x) uma propriedade demonstrável acerca de objectos x do tipo B. Então, p(y) também deve verificar-se para objectos y do tipo D onde S é um subtipo de B.Barbara H. Liskov e  Jeannette M. Wing, “A Behavioral Notion of Subtyping”, ACM Transactions m Programming Languages and Systems, Volume 16, N.º 6, Novembro de 1994, pp. 1811-1841.Ver http://en.wikipedia.org/wiki/Liskov_substitution_principle.2009/2010Programação Orientada por Objectos15Tem de ser o programador a garantir que este princípio se verifica!
  • 16. O que aparece na consola?Supervisor supervisor = new Supervisor("Guilhermina", "123456789", 3);Employee anEmployee = new Supervisor("Felisberto", "987654321", 5);Employee anotherEmployee = new Employee("Elvira", "111111111");out.println(supervisor.toString());out.println(anEmployee.toString());out.println(anotherEmployee.toString());2009/2010Programação Orientada por Objectos16_(Guilhermina, 123456789, 3)_(Guilhermina, 123456789, 3)(Felisberto, 987654321, 5)_(Guilhermina, 123456789, 3)(Felisberto, 987654321, 5)(Elvira, 111111111)_
  • 17. Polimorfismo: operações e métodosUma operação polimórfica ou virtual pode ter várias implementaçõesA uma implementação de uma operação chama-se métodoA uma operação polimórfica podem corresponder diferentes métodos, cada um em sua classeTodas as operações em Java são polimórficas, com excepção das qualificadas com privateUma classe é polimórfica se tiver pelo menos uma operação polimórfica2009/2010Programação Orientada por Objectos17
  • 18. Polimorfismo: operações e métodosInvoca-se uma operação sobre um objecto de uma classe para atingir um objectivoInvocação de uma operação leva à execução do método apropriado, ou seja, leva à execução da implementação apropriada da operaçãoPolimorfismoInvocação de uma operação pode levar à execução de diferentes métodosMétodo efectivamente executado depende da classe do objecto sobre o qual a operação é invocadaMétodo executadonão depende do tipo da referência para o objecto utilizado2009/2010Programação Orientada por Objectos18Simplificação… invocações internas podem levar à execução de métodos privados directamente.
  • 19. A classe Objectpublic class Employee extends Object { private String name;   private String ssn; public Employee(final String name, final String ssn) { this.name = name; this.ssn = ssn; } public String getName() { return name; } public String getSsn() { return ssn; } @Override public String toString() { return "(" + getName() + ", " + getSsn() + ")"; }}2009/2010Programação Orientada por Objectos19Se uma classe não derivar explicitamente de outra, derivará implicitamente da classe Object, que está no topo da hierarquia de classes do Java.Agora percebe-se! A classe Object declara a operação toString() e define imediatamente um correspondente método. Esta é uma sua especialização.
  • 20. Ligação estática vs. dinâmicaLigação (binding)Associação entre a invocação de uma operação e a execução de um métodoLigação estática Operações não polimórficas, invocações através de superAssociação estabelecida em tempo de compilaçãoLigação dinâmicaOperações polimórficasAssociação estabelecida apenas em tempo de execução2009/2010Programação Orientada por Objectos20Que é isto? Veremos à frente…
  • 21. Métodos finaisClasse derivada não é obrigada a fornecer método para operação da classe baseClasse base pode proibir às classes derivadas a sobreposição de um seu método, que se dirá ser um método finalRazão para um método ser final:Programador que forneceu o método na classe base entendeu que classes derivadas não deveriam poder especializar o modo de funcionamento desse método2009/2010Programação Orientada por Objectos21
  • 22. Uma ajudinha da classe basepublic class Base { public String className() { return "Base"; }}public class Derived extends Base { @Override public String className() { return “Derived”; } public void testCalls() { Base base = (Base)this; out.println("Through this: " + this.className()); out.println("Through base: " + base.className()); out.println("Through super: " + super.className()); }}2009/2010Programação Orientada por Objectos22_Throughthis: Derived_Throughthis: DerivedThrough base: Derived_Throughthis: DerivedThrough base: DerivedThrough super: Base_
  • 23. Análise: conceitosVeículoMotocicloAutomóvelHonda NX 650Audi TT2009/2010Programação Orientada por Objectos23VehicleMotorcycleCarHondaNx650AudiTtAnálise inicial pode resultar num dicionário ou glossário do domínio.
  • 24. Análise: relaçõesUm Automóvel é um VeículoUm Motociclo é um VeículoUma Honda NX 650 é um MotocicloUm Audi TT é um Automóvel2009/2010Programação Orientada por Objectos24Pode refinar-se o dicionário ou glossário do domínio, acrescentando as relações entre conceitos.VehicleCarMotorcycleAudiTtHondaNx650
  • 25. Desenho2009/2010Programação Orientada por Objectos25VehiclePropriedades……OperaçõesCarMotorcycle…………AudiTtHondaNx650…………
  • 26. Implementaçãopublic class Vehicle { …}public class Car extends Vehicle { …}public class Motorcycle extends Vehicle { …}public class HondaNx650 extends Motorcycle { …}public class AudiTt extends Car { …}2009/2010Programação Orientada por Objectos26
  • 27. Conceitos abstractos e concretosConceito abstracto – Sem instâncias no domínio em causaConceito concreto – Com instâncias no domínio em causaConceitos identificados são abstractos ou concretos?Dependendo do domínio e seu modelo… Veículo e Automóvel abstractos; Audi TT concretoVeículo abstracto; Automóvel e Audi TT concretos2009/2010Programação Orientada por Objectos27
  • 28. Análise e desenhoHipótese 1Hipótese 22009/2010Programação Orientada por Objectos28VehicleVehicleCarCarMotorcycleMotorcycleÉ boa prática que as classes concretas sejam folhas na hierarquia.AudiTtHondaNx650As classes abstractas, correspondentes aos conceitos abstractos, têm o nome em itálico.
  • 29. Implementação: hipótese 1public abstract class Vehicle { …}public class Car extends Vehicle { …}public class Motorcycle extends Vehicle { …}2009/2010Programação Orientada por Objectos29
  • 30. Implementação: hipótese 2public abstract class Vehicle { …}public abstract class Car extends Vehicle { …}public abstract class Motorcycle extends Vehicle { …}public class HondaNx650 extends Motorcycle { …}public class AudiTt extends Car { …}2009/2010Programação Orientada por Objectos30
  • 31. Caixa de ferramentas: Positionpublic class Position { private double x; private double y; public Position(final double x, final double y) { this.x = x; this.y = y; } public final double getX() { return x; } public final double getY() { return y; }}2009/2010Programação Orientada por Objectos31
  • 32. Caixa de ferramentas: Sizepublic class Size { private double width; private double height; public Size(final double width, final double height) { this.width = width; this.height = height; } public final double getWidth() { return width; } public final double getHeight () { return height; }}2009/2010Programação Orientada por Objectos32Apesar de ter também dois atributos do tipo double, um Size não é uma Position.
  • 33. Caixa de ferramentas: Boxpublic class Box { private Position topLeftCornerPosition; private Size size; public Box(final Position topLeftCornerPosition, final Size size) { this.topLeftCornerPosition = topLeftCornerPosition; this.size = size; } public final Position getTopLeftCornerPosition() { return position; } public final Size getSize() { return size; }}2009/2010Programação Orientada por Objectos33Uma Box não é nem uma Position, nem um Size, mas é composta por uma Position e por um Size.
  • 35. Análise: relaçõesUma Figura é composta de FormasUm Círculo é uma FormaUm Quadrado é uma Forma2009/2010Programação Orientada por Objectos35FigureShapeRelação de composição.CircleSquare
  • 36. Desenho2009/2010Programação Orientada por Objectos36FigureShape…………CircleSquare…………
  • 37. Implementaçãopublic class Figure { private Vector<Shape> shapes; …}public abstract class Shape { …}public class Circle extends Shape { …}public class Square extends Shape { …}2009/2010Programação Orientada por Objectos37
  • 38. Implementação: Shapepublic abstract class Shape { private Position position; public Shape(final Position position) {this.position = position; } public final Position getPosition() { return position; } public abstract double getArea(); public abstract double getPerimeter(); public abstract Box getBoundingBox(); public void moveTo(final Position newPosition) { position = newPosition; }}2009/2010Programação Orientada por Objectos38Qual a área de uma “forma”??Operações abstractas, ou seja, operações sem qualquer implementação disponível até este nível da hierarquia.
  • 39. Implementação: Circlepublic class Circle extends Shape { private double radius; public Circle(final Position position, final double radius) { super(position);this.radius = radius; } public final double getRadius() { return radius; } …2009/2010Programação Orientada por Objectos39Um Circle é uma Shape e a classe Circle herda a implementação da classe Shape.É necessário apenas um atributo adicional, correspondente a uma das duas propriedades de um círculo (o raio), já que a posição do centro é herdada da classe Shape.Uma ajudinha da classe base…
  • 40. Implementação: Circle … @Override public double getArea() { return Math.PI * getRadius() * getRadius(); } @Override public double getPerimeter() { return 2.0 * Math.PI * getRadius(); } @Override public Box getBoundingBox() { return new Box( new Position(getPosition().getX() - getRadius(),getPosition().getY() - getRadius()), new Size(2.0 * getRadius(), 2.0 * getRadius()) ); }}2009/2010Programação Orientada por Objectos40Qual a área de um círculo? Fácil, π×r2.Fornece-se implementações, ou seja, métodos, para cada uma das operações abstractas da classe Shape.
  • 41. Desenho pormenorizado2009/2010Programação Orientada por Objectos41ShapeFigure- position : Position + Shape(position : Position)+ getPosition() : Position+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : Box+ moveTo(newPosition : Position)CircleSquare- radius : double+ Circle(position : Position, radius : double)+ getRadius() : double+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : Box
  • 42. Desenho pormenorizado2009/2010Programação Orientada por Objectos42ShapeFigure- position : Position «constructors»+ Shape(position : Position)«inspectors»+ getPosition() : Position+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : BoxCircleSquare- radius : double«constructors»+ Circle(position : Position, radius : double)«modifiers»+ moveTo(newPosition : Position)«inspectors»+ getRadius() : double+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : Box
  • 43. Classes abstractasUma operação com qualificador abstract é uma simples declaração da operaçãoUma operação sem qualificador abstract inclui também a definição de um método correspondente, que a implementaUma classe com uma operação abstracta tem de ser uma classe abstractaUma classe é abstracta se tiver o qualificador abstract2009/2010Programação Orientada por Objectos43
  • 44. Classes abstractasUma classe não abstracta diz-se uma classe concretaUma classe abstracta não pode ser instanciada, i.e., não se podem construir objectos de uma classe abstractaUma classe derivada directamente de uma classe abstracta só poderá ser concreta se implementar cada uma das operações abstractas da classe abstracta2009/2010Programação Orientada por Objectos44
  • 45. A reter...Generalização – Relação entre duas classes, base e derivada, em que a derivada especializa a base, que por sua vez generaliza a derivadaPolimorfismo – Um mesmo objecto pode ser visto de formas diferentes consoante o tipo da referência usada para o referenciar: uma mesma referência pode referenciar objectos de diferentes classesOperação abstracta – Uma operações declarada numa dada classe mas não implementada nessa classeClasse abstracta – Uma classe que não pode ser instanciada, i.e., da qual não existem objectos; usualmente as classes abstractas têm pelo menos uma operação abstracta2009/2010Programação Orientada por Objectos45
  • 46. A ler para as próximas aulas ...Capítulos 1 a 10 e 16 do livro:Y. Daniel Liang, Introduction to Java Programming, 7.ª edição, Prentice-Hall, 2008.ISBN: 978-0-13-605966-02009/2010Programação Orientada por Objectos46
  • 47. SumárioPolimorfismo de subtiposClasses e operações polimórficasHerançaLigação estática e ligação dinâmicaClasses abstractas e classes concretasOperações abstractasAnálise, desenho e implementaçãoDicionário do domínioConceitosConceitos concretos e conceitos abstractos2009/2010Programação Orientada por Objectos47