programação orientada por objectos - aula 2

Post on 11-Jun-2015

3.000 Views

Category:

Education

1 Downloads

Preview:

Click to see full reader

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

Aula 2

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

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

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…

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.

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.

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.

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

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.

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

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

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().

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.

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

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

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

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

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.

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.

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…

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

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_

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.

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.

Desenho

2009/2010 Programação Orientada por Objectos 25

Vehicle

Car Motorcycle

AudiTt HondaNx650

……

PropriedadesOperações

……

……

……

……

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

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

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.

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

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

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

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.

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.

Análise: conceitos

Figura

Forma (abstrato)

Círculo

Quadrado

2009/2010 Programação Orientada por Objectos 34

Figure

Circle

Shape

Square

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.

Desenho

2009/2010 Programação Orientada por Objectos 36

Shape

Circle Square

……

……

……

Figure

……

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

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”??

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…

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.

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

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

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

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

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

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

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

top related