2.2 Herencia y polimorfismo - ajpaez/OCA GitHub Wiki

(OCA Objectives 7.1, 7.2, and 7.3)

Las dos razones mas comunes para promover la herencia son:

  • Promover la reutilización de código
  • Para utilizar el polimorfismo
class GameShape {
  public void displayShape() {
    System.out.println("displaying shape");
  }
  // more code
}
class PlayerPiece extends GameShape {
  public void movePiece() {
    System.out.println("moving game piece");
  }
  // more code
}

class TilePiece extends GameShape {
  public void getAdjacent() {
    System.out.println("getting adjacent tiles");
  }
  // more code
}
public class TestShapes {
  public static void main (String[] args) {
    PlayerPiece player = new PlayerPiece();
    TilePiece tile = new TilePiece();
    doShapes(player);
    doShapes(tile);
  }
  public static void doShapes(GameShape shape) {
    shape.displayShape();
  }
}

En este ejemplo podemos ver como se reutiliza el código de la clase GameShape. Esto garantiza que todas las subclases que se creen tendrán las capacidades de la superclase. Lo siguiente que se puede ver es el polimorfismo, cualquier sublcase se puede tratar como la superclase, una capacidad dada por las interfaces. El punto clase, esta en que el método doShapes, espera un GameShape pero se le pasa dos subtipos de esta clase. Los métodos a las que se puede llamar con una referencia son totalmente dependientes del tipo de variable declarada, no importa el objeto real al que se refiere.

IS-A

En, OO, el concepto IS-A esta basado en la herencia de clases o en la implementación de interfaces. IS-A es una forma de decir, "Esta cosa es un tipo de esta otra cosa". Por ejemplo, "Subaru IS-A Car". La relación IS-A se expresa a través de la palabra reservada extends (para heredad clase) e implements (para implementar una interfaz). Si la expresión (Foo instanceof Bar) es true, entonces la clase Foo IS-A Bar, incluso si Foo no extiende directamente de Bar y hereda de otra clase que es una subclase de Bar.

HAS-A

La relación HAS-A está basada en el uso, en vez de en la herencia. En otras palabras, la clase A HAS-A B si el código de la clase A tiene una referencia a una instancia de la clase B. a través, de la cual puede llamar a métodos de la clase B, sin tener código relativo de dicha clase en la clase A . Por ejemplo, podemos decir que: Horse IS-A Animal y Horse HAS-A Halter

public class Animal { }
public class Horse extends Animal {
  private Halter myHalter;
}

La relación HAS-A, le permite seguir las buenas practicas de OO, ya que no encontramos clases que hacen tareas de diferentes objetos, sino clases especializadas. Al tener clases mas especializadas mas probabilidad existe de poder reutilizar la clase en otras aplicaciones.