Programação Orientada por Objectos - Aula 2
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Programação Orientada por Objectos - Aula 2

  • 3,688 views
Uploaded on

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.

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.

More in: Education , Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
3,688
On Slideshare
2,878
From Embeds
810
Number of Embeds
9

Actions

Shares
Downloads
135
Comments
0
Likes
0

Embeds 810

http://zago.zip.net 638
http://www.jornaljava.com 80
http://blog.uol.com.br 60
http://poo.dcti.iscte.pt 15
http://www.slideshare.net 5
http://www.linkedin.com 4
https://www.linkedin.com 4
http://aw.zago.sites.uol.com.br 3
http://cc.bingj.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Aula 2
    Polimorfismo de subtipos
    Análise, desenho e implementação
  • 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
  • 3. Employee
    publicclassEmployee {
    privateStringname;
      privateStringssn;
    publicEmployee(final Stringname, final Stringssn) {
    this.name = name;
    this.ssn = ssn;
    }
    publicStringgetName() {
    returnname;
    }
    publicStringgetSsn() {
    returnssn;
    }
    @Override
    publicStringtoString() {
    return "(" + getName() + ", " + getSsn() + ")";
    }
    }
    2009/2010
    Programação Orientada por Objectos
    3
    Que é isto? Veremos à frente…
  • 4. Generalização (relação)
    2009/2010
    Programação Orientada por Objectos
    4
    Employee
    Generalização
    Especialização
    Supervisor
    Relação de generalização
    • Um Supervisoré umEmployee.
    • 5. Um Employeepode ser umSupervisor.
  • Herança
    public 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/2010
    Programação Orientada por Objectos
    5
    Um 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/2010
    Programação Orientada por Objectos
    6
    Classe base ou superclasse.
    Employee
    Generalização
    Especialização
    Supervisor
    Classe derivada ou subclasse.
  • 7. 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
  • 8. 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 superior
    2009/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.
  • 9. 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 universal
    2009/2010
    Programação Orientada por Objectos
    9
    Acessibilidade crescente
  • 10. 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
  • 11. 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
    Invocação da operação toString().
    Qual o método toString() executado?
  • 12. Organização
    2009/2010
    Programação Orientada por Objectos
    12
    0
    1
    : Employee
    : Supervisor
    employees : «ref» Vector<Employee>
    : Vector<Employee>
    : «ref» Employee
    : «ref» Employee
    name = “João Maria”
    ssn = “123456789”
    name = “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.
  • 13. 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)
    _
  • 14. 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
  • 15. Princípio da substituição de Liskov
    Seja 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/2010
    Programação Orientada por Objectos
    15
    Tem 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/2010
    Programação Orientada por Objectos
    16
    _
    (Guilhermina, 123456789, 3)
    _
    (Guilhermina, 123456789, 3)
    (Felisberto, 987654321, 5)
    _
    (Guilhermina, 123456789, 3)
    (Felisberto, 987654321, 5)
    (Elvira, 111111111)
    _
  • 17. 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
  • 18. 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 executadonão depende do tipo da referência para o objecto utilizado
    2009/2010
    Programação Orientada por Objectos
    18
    Simplificação… invocações internas podem levar à execução de métodos privados directamente.
  • 19. 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
    Se 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â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ção
    2009/2010
    Programação Orientada por Objectos
    20
    Que é isto? Veremos à frente…
  • 21. 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
  • 22. Uma ajudinha da classe base
    public 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
    _
    Throughthis: Derived
    _
    Throughthis: Derived
    Through base: Derived
    _
    Throughthis: Derived
    Through base: Derived
    Through super: Base
    _
  • 23. Análise: conceitos
    Veículo
    Motociclo
    Automóvel
    Honda NX 650
    Audi TT
    2009/2010
    Programação Orientada por Objectos
    23
    Vehicle
    Motorcycle
    Car
    HondaNx650
    AudiTt
    Análise inicial pode resultar num dicionário ou glossário do domínio.
  • 24. 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
    Pode refinar-se o dicionário ou glossário do domínio, acrescentando as relações entre conceitos.
    Vehicle
    Car
    Motorcycle
    AudiTt
    HondaNx650
  • 25. Desenho
    2009/2010
    Programação Orientada por Objectos
    25
    Vehicle
    Propriedades


    Operações
    Car
    Motorcycle




    AudiTt
    HondaNx650




  • 26. 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
  • 27. 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
  • 28. Análise e desenho
    Hipótese 1
    Hipótese 2
    2009/2010
    Programação Orientada por Objectos
    28
    Vehicle
    Vehicle
    Car
    Car
    Motorcycle
    Motorcycle
    É boa prática que as classes concretas sejam folhas na hierarquia.
    AudiTt
    HondaNx650
    As classes abstractas, correspondentes aos conceitos abstractos, têm o nome em itálico.
  • 29. Implementação: hipótese 1
    public abstract class Vehicle {

    }
    public class Car extends Vehicle {

    }
    public class Motorcycle extends Vehicle {

    }
    2009/2010
    Programação Orientada por Objectos
    29
  • 30. Implementação: hipótese 2
    public 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
  • 31. 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
  • 32. Caixa de ferramentas: Size
    public 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.
  • 33. Caixa de ferramentas: Box
    public 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.
  • 34. Análise: conceitos
    Figura
    Forma (abstrato)
    Círculo
    Quadrado
    2009/2010
    Programação Orientada por Objectos
    34
    Figure
    Shape
    Circle
    Square
  • 35. 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
    Figure
    Shape
    Relação de composição.
    Circle
    Square
  • 36. Desenho
    2009/2010
    Programação Orientada por Objectos
    36
    Figure
    Shape




    Circle
    Square




  • 37. 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
  • 38. 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
    Qual 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: 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…
  • 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/2010
    Programação Orientada por Objectos
    40
    Qual 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 pormenorizado
    2009/2010
    Programação Orientada por Objectos
    41
    Shape
    Figure
    - position : Position
    + Shape(position : Position)
    + getPosition() : Position
    + getArea() : double
    + getPerimeter() : double
    + getBoundingBox() : Box
    + moveTo(newPosition : Position)
    Circle
    Square
    - radius : double
    + Circle(position : Position,
    radius : double)
    + getRadius() : double
    + getArea() : double
    + getPerimeter() : double
    + getBoundingBox() : Box
  • 42. Desenho pormenorizado
    2009/2010
    Programação Orientada por Objectos
    42
    Shape
    Figure
    - position : Position
    «constructors»
    + Shape(position : Position)
    «inspectors»
    + getPosition() : Position
    + getArea() : double
    + getPerimeter() : double
    + getBoundingBox() : Box
    Circle
    Square
    - radius : double
    «constructors»
    + Circle(position : Position,
    radius : double)
    «modifiers»
    + moveTo(newPosition : Position)
    «inspectors»
    + getRadius() : double
    + getArea() : double
    + getPerimeter() : double
    + getBoundingBox() : Box
  • 43. 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
  • 44. 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
  • 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 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
  • 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-0
    2009/2010
    Programação Orientada por Objectos
    46
  • 47. 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