programação orientada por objectos - aula 2

46
Aula 2 Polimorfismo de subtipos Análise, desenho e implementação

Upload: manuel-menezes-de-sequeira

Post on 11-Jun-2015

3.000 views

Category:

Education


1 download

DESCRIPTION

Aula teórica 2 da unidade (disciplina) de Programação Orientada por Objectivos para os cursos de LIGE, LEI e LETI no ISCTE-IUL no 2.º semestre do ano lectivo de 2009/2010.

TRANSCRIPT

Page 1: Programação Orientada por Objectos - Aula 2

Aula 2

Polimorfismo de subtiposAnálise, desenho e implementação

Page 2: Programação Orientada por Objectos - Aula 2

Na aula anterior …

Introdução à programação orientada por objectos

Classes, objectos e referências (revisão)

Modularização em pacotes Organização em ficheiros e

directórios

2009/2010 Programação Orientada por Objectos 2

Page 3: Programação Orientada por Objectos - Aula 2

Employee

public class Employee {

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/2010 Programação Orientada por Objectos 3

Que é isto? Veremos à frente…

Page 4: Programação Orientada por Objectos - Aula 2

Generalização (relação)

2009/2010 Programação Orientada por Objectos 4

Employee

Supervisor

Relação de generalização

Esp

ecia

lizaçã

o

Genera

lizaç

ão

• Um Supervisor é um Employee.• Um Employee pode ser um Supervisor.

Page 5: Programação Orientada por Objectos - Aula 2

Herança

public class Supervisor extends Employee {

    private int level;

    public Supervisor(final String name, final String ssn, final int level) { … }

    public int getLevel() { return level; }

@Override    public String toString() { return "(" + getName() + ", " + getSsn() + ", " + getLevel() + ")"; }}

2009/2010 Programação Orientada por Objectos 5

Um Supervisor é um Employee.

Sobrepõe-se ao método com a mesma assinatura na classe base Employee.

Novo método específico da classe Supervisor.

Page 6: Programação Orientada por Objectos - Aula 2

Generalização (relação)

2009/2010 Programação Orientada por Objectos 6

Employee

Supervisor

Esp

ecia

lizaçã

o

Genera

lizaç

ão

Classe base ou superclasse.

Classe derivada ou subclasse.

Page 7: Programação Orientada por Objectos - Aula 2

Herança

Classe derivada deriva da classe base(subclasse deriva da superclasse)

Membros são herdados e mantêm categoria de acesso

Relação é um – Referências do tipo da classe base podem referir-se a objectos de classes derivadas

Exemplo

Supervisor supervisor = new Supervisor("Guilhermina", "123456789", 3);

Employee employee = new Supervisor("Felisberto", "987654321", 5);

2009/2010 Programação Orientada por Objectos 7

Page 8: Programação Orientada por Objectos - Aula 2

Sobreposição

Método de classe derivada pode sobrepor-se a método de classe base

Sobreposição é especialização

Regras Mesma assinatura e tipo de devolução

compatível Método na classe base não privado e não final Método na classe derivada com acessibilidade

igual ou superior2009/2010 Programação Orientada por Objectos 8

Na 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.

Page 9: Programação Orientada por Objectos - Aula 2

Categorias de acesso (de novo) Características ou membros podem ser

private – acesso apenas por outros membros da mesma classe

package-private (sem qualificador) – adicionalmente, acesso por membros de classes do mesmo pacote

protected – adicionalmente, acesso por membros de classes derivadas

public – acesso universal2009/2010 Programação Orientada por Objectos 9

Ace

ssib

ilidad

e c

resc

ente

Page 10: Programação Orientada por Objectos - Aula 2

Interfaces de uma classe

Própria classe Membros da classe e membros não privados de classes

base

Classe do mesmo pacote Membros não privados da classe ou suas bases

Classe derivada Membros protegidos ou públicos da classe ou suas

bases

Outra classe Membros públicos da classe ou suas bases

2009/2010 Programação Orientada por Objectos 10

Page 11: Programação Orientada por Objectos - Aula 2

Exemplo

Vector<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/2010 Programação Orientada por Objectos 11

Qual o método toString() executado?

Invocação da operação toString().

Page 12: Programação Orientada por Objectos - Aula 2

Organização

2009/2010 Programação Orientada por Objectos 12

employees : «ref» Vector<Employee>

: Vector<Employee>

: «ref» Employee

0

: «ref» Employee

1

: Employeename = “João Maria”ssn = “123456789”

: Supervisorname = “Ana Maria”ssn = “987654321”level = 4

Possível porque a classe Supervisor deriva da classe Employee, ou seja, possível porque um Supervisor é (sempre também) um Employee.

Page 13: Programação Orientada por Objectos - Aula 2

Resultado

2009/2010 Programação Orientada por Objectos 13

O 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)_

Page 14: Programação Orientada por Objectos - Aula 2

Polimorfismo

Capacidade de um objecto tomar várias formas A forma descrita pela classe a que pertence As formas descritas pelas classes acima na

hierarquia a que pertence

Objecto pode ser referenciado por referências do tipo da classe a que pertence ou de classes acima na hierarquia (mais genéricas)

2009/2010 Programação Orientada por Objectos 14

Page 15: Programação Orientada por Objectos - Aula 2

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/2010 Programação Orientada por Objectos 16

_(Guilhermina, 123456789, 3)_(Guilhermina, 123456789, 3)(Felisberto, 987654321, 5)_

(Guilhermina, 123456789, 3)(Felisberto, 987654321, 5)(Elvira, 111111111)_

Page 16: Programação Orientada por Objectos - Aula 2

Polimorfismo: operações e métodos

Uma operação polimórfica ou virtual pode ter várias implementações

A uma implementação de uma operação chama-se método

A uma operação polimórfica podem corresponder diferentes métodos, cada um em sua classe

Todas as operações em Java são polimórficas, com excepção das qualificadas com private

Uma classe é polimórfica se tiver pelo menos uma operação polimórfica

2009/2010 Programação Orientada por Objectos 17

Page 17: Programação Orientada por Objectos - Aula 2

Polimorfismo: operações e métodos

Invoca-se uma operação sobre um objecto de uma classe para atingir um objectivo

Invocação de uma operação leva à execução do método apropriado, ou seja, leva à execução da implementação apropriada da operação

Polimorfismo Invocação de uma operação pode levar à execução de

diferentes métodos Método efectivamente executado depende da classe do

objecto sobre o qual a operação é invocada Método executado não depende do tipo da referência para

o objecto utilizado2009/2010 Programação Orientada por Objectos 18

Simplificação… invocações internas podem levar à execução de métodos privados directamente.

Page 18: Programação Orientada por Objectos - Aula 2

A classe Object

public 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/2010 Programação Orientada por Objectos 19

Agora percebe-se! A classe Object declara a operação toString() e define imediatamente um correspondente método. Esta é uma sua especialização.

Se uma classe não derivar explicitamente de outra, derivará implicitamente da classe Object, que está no topo da hierarquia de classes do Java.

Page 19: Programação Orientada por Objectos - Aula 2

Ligação estática vs. dinâmica Ligação (binding)

Associação entre a invocação de uma operação e a execução de um método

Ligação estática Operações não polimórficas, invocações através de super

Associação estabelecida em tempo de compilação

Ligação dinâmica Operações polimórficas Associação estabelecida apenas em tempo de

execução2009/2010 Programação Orientada por Objectos 20

Que é isto? Veremos à frente…

Page 20: Programação Orientada por Objectos - Aula 2

Métodos finais

Classe derivada não é obrigada a fornecer método para operação da classe base

Classe base pode proibir às classes derivadas a sobreposição de um seu método, que se dirá ser um método final

Razã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étodo

2009/2010 Programação Orientada por Objectos 21

Page 21: Programação Orientada por Objectos - Aula 2

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/2010 Programação Orientada por Objectos 22

_Through this: Derived_Through this: DerivedThrough base: Derived_

Through this: DerivedThrough base: DerivedThrough super: Base_

Page 22: Programação Orientada por Objectos - Aula 2

Análise: conceitos

Veículo

Motociclo

Automóvel

Honda NX 650

Audi TT

2009/2010 Programação Orientada por Objectos 23

Vehicle

Car

Motorcycle

AudiTt

HondaNx650

Análise inicial pode resultar num dicionário ou glossário do domínio.

Page 23: Programação Orientada por Objectos - Aula 2

Análise: relações

Um Automóvel é um Veículo Um Motociclo é um Veículo Uma Honda NX 650 é um Motociclo Um Audi TT é um Automóvel

2009/2010 Programação Orientada por Objectos 24

Vehicle

Car Motorcycle

AudiTt HondaNx650

Pode refinar-se o dicionário ou glossário do domínio, acrescentando as relações entre conceitos.

Page 24: Programação Orientada por Objectos - Aula 2

Desenho

2009/2010 Programação Orientada por Objectos 25

Vehicle

Car Motorcycle

AudiTt HondaNx650

……

PropriedadesOperações

……

……

……

……

Page 25: Programação Orientada por Objectos - Aula 2

Implementação

public class Vehicle { …}

public class Car extends Vehicle { …}

public class Motorcycle extends Vehicle { …}

public class HondaNx650 extends Motorcycle { …}

public class AudiTt extends Car { …}

2009/2010 Programação Orientada por Objectos 26

Page 26: Programação Orientada por Objectos - Aula 2

Conceitos abstractos e concretos Conceito abstracto – Sem instâncias no domínio

em causa

Conceito concreto – Com instâncias no domínio em causa

Conceitos identificados são abstractos ou concretos?

Dependendo do domínio e seu modelo… Veículo e Automóvel abstractos; Audi TT concreto Veículo abstracto; Automóvel e Audi TT concretos

2009/2010 Programação Orientada por Objectos 27

Page 27: Programação Orientada por Objectos - Aula 2

Análise e desenho

HIPÓTESE 1 HIPÓTESE 2

2009/2010 Programação Orientada por Objectos 28

Vehicle

Car Motorcycle

Vehicle

Car Motorcycle

AudiTt HondaNx650

As classes abstractas, correspondentes aos conceitos abstractos, têm o nome em itálico.

É boa prática que as classes concretas sejam folhas na hierarquia.

Page 28: Programação Orientada por Objectos - Aula 2

Implementação: hipótese 1public abstract class Vehicle { …}

public class Car extends Vehicle { …}

public class Motorcycle extends Vehicle { …}

2009/2010 Programação Orientada por Objectos 29

Page 29: Programação Orientada por Objectos - Aula 2

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/2010 Programação Orientada por Objectos 30

Page 30: Programação Orientada por Objectos - Aula 2

Caixa de ferramentas: Position

public 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/2010 Programação Orientada por Objectos 31

Page 31: Programação Orientada por Objectos - Aula 2

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/2010 Programação Orientada por Objectos 32

Apesar de ter também dois atributos do tipo double, um Size não é uma Position.

Page 32: Programação Orientada por Objectos - Aula 2

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/2010 Programação Orientada por Objectos 33

Uma Box não é nem uma Position, nem um Size, mas é composta por uma Position e por um Size.

Page 33: Programação Orientada por Objectos - Aula 2

Análise: conceitos

Figura

Forma (abstrato)

Círculo

Quadrado

2009/2010 Programação Orientada por Objectos 34

Figure

Circle

Shape

Square

Page 34: Programação Orientada por Objectos - Aula 2

Análise: relações

Uma Figura é composta de Formas Um Círculo é uma Forma Um Quadrado é uma Forma

2009/2010 Programação Orientada por Objectos 35

Shape

Circle Square

Figure

Relação de composição.

Page 35: Programação Orientada por Objectos - Aula 2

Desenho

2009/2010 Programação Orientada por Objectos 36

Shape

Circle Square

……

……

……

Figure

……

Page 36: Programação Orientada por Objectos - Aula 2

Implementação

public class Figure { private Vector<Shape> shapes; …}

public abstract class Shape { …}

public class Circle extends Shape { …}

public class Square extends Shape { …}2009/2010 Programação Orientada por Objectos 37

Page 37: Programação Orientada por Objectos - Aula 2

Implementação: Shape

public 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/2010 Programação Orientada por Objectos 38

Operações abstractas, ou seja, operações sem qualquer implementação disponível até este nível da hierarquia.

Qual a área de uma “forma”??

Page 38: Programação Orientada por Objectos - Aula 2

Implementação: Circle

public 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/2010 Programação Orientada por Objectos 39

Um 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…

Page 39: Programação Orientada por Objectos - Aula 2

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/2010 Programação Orientada por Objectos 40

Fornece-se implementações, ou seja, métodos, para cada uma das operações abstractas da classe Shape.

Qual a área de um círculo? Fácil, π × r2.

Page 40: Programação Orientada por Objectos - Aula 2

Desenho pormenorizado

2009/2010 Programação Orientada por Objectos 41

Shape

Circle Square

- position : Position + Shape(position : Position)+ getPosition() : Position+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : Box+ moveTo(newPosition : Position)

- radius : double+ Circle(position : Position, radius : double)+ getRadius() : double+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : Box

Figure

Símbolo

Categoria de acesso

- private

~ package-private

# protected

+ public

Page 41: Programação Orientada por Objectos - Aula 2

Desenho pormenorizado

2009/2010 Programação Orientada por Objectos 42

Shape

Circle Square

- position : Position «constructors»

+ Shape(position : Position)

- radius : double«constructors»

+ Circle(position : Position, radius : double)

Figure

«inspectors»+ getPosition() : Position+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : Box

«modifiers»+ moveTo(newPosition : Position)«inspectors»

+ getRadius() : double+ getArea() : double+ getPerimeter() : double+ getBoundingBox() : Box

Page 42: Programação Orientada por Objectos - Aula 2

Classes abstractas

Uma operação com qualificador abstract é uma simples declaração da operação

Uma operação sem qualificador abstract inclui também a definição de um método correspondente, que a implementa

Uma classe com uma operação abstracta tem de ser uma classe abstracta

Uma classe é abstracta se tiver o qualificador abstract

2009/2010 Programação Orientada por Objectos 43

Page 43: Programação Orientada por Objectos - Aula 2

Classes abstractas

Uma classe não abstracta diz-se uma classe concreta

Uma classe abstracta não pode ser instanciada, i.e., não se podem construir objectos de uma classe abstracta

Uma classe derivada directamente de uma classe abstracta só poderá ser concreta se implementar cada uma das operações abstractas da classe abstracta

2009/2010 Programação Orientada por Objectos 44

Page 44: Programação Orientada por Objectos - Aula 2

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 derivada

Polimorfismo – 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 classes

Operação abstracta – Uma operações declarada numa dada classe mas não implementada nessa classe

Classe 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 abstracta

2009/2010 Programação Orientada por Objectos 45

Page 45: Programação Orientada por Objectos - Aula 2

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-0

2009/2010 Programação Orientada por Objectos 46

Page 46: Programação Orientada por Objectos - Aula 2

Sumário

Polimorfismo de subtipos Classes e operações polimórficas Herança Ligação estática e ligação dinâmica Classes abstractas e classes concretas Operações abstractas

Análise, desenho e implementação Dicionário do domínio Conceitos Conceitos concretos e conceitos abstractos

2009/2010 Programação Orientada por Objectos 47