Programación Orientada a Objetos I



Descargar 13,61 Kb.
Fecha de conversión20.09.2017
Tamaño13,61 Kb.

Programación Orientada a Objetos I

  • Unidad 4
  • Relaciones entre clases: herencia.

Contenido

Introducción

  • La herencia es una forma de reutilización de software, en la cual se crean clases nuevas a partir de clases existentes, mediante la absorción de atributos y comportamientos, y embelleciendo éstos con las capacidades que las clases nuevas requieren (Deitel y Deitel, 1995).

Clase base y clase derivada

  • Al crear una nueva clase, en vez de escribir en su totalidad los miembros de datos y métodos, el programador puede determinar que la clase nueva puede heredar estos datos y métodos provenientes e una clase ya definida. La clase nueva se conoce como clase derivada, y la clase ya definida como clase base.
  • Las clases base también son conocidas como superclases y las clases derivadas como subclases.
  • A su vez, cualquier clase derivada puede convertirse en una clase base.

Clase base y clase derivada … (2)

  • Con la herencia, todas las clases están clasificadas en una jerarquía estricta. Una clase es más especializada cuanto más alejada esté de la raíz (superclase original).
  • En Java, la clase Object es la clase raíz de la jerarquía de clases en todo el sistema, por tanto define los atributos y comportamientos comunes a todas las clases de Java.

Clase base y clase derivada … (3)

  • La herencia forma estructuras jerárquicas de apariencia arborescente. Cuando se emplea el mecanismo de herencia una clase se convierte en clase base (superclase) y otra en clase derivada (subclase).

Clase base y clase derivada … (4)

  • En Java la palabra clave extends se usa para generar una subclase (generalización):
  • En C++ para especificar que una clase se deriva de otra típicamente se usa la siguiente sintaxis:
  • .

Clase base y clase derivada … (5)

  • Ejemplo típico del uso de la herencia en Java:

Clases base directas e indirectas

  • Una clase base puede ser una clase base directa o indirecta para una clase derivada.
  • Las clases base directas son listadas de forma explícita cuando la clase derivada es definida.
  • Las clases base indirectas no se listan en forma explícita, ya que se encuentra varios niveles arriba en la jerarquía de herencia.

Redefinición de métodos de una clase base en una clase derivada

  • Una clase derivada (subclase) puede redefinir métodos (comportamientos) de su clase base (superclase).
  • Cuando en la subclase un método redefinido es llamado por su nombre, entonces se usa el método de la subclase, para usar el método “original” de la superclase se debe indicar explícitamente:

Redefinición de métodos de una clase base en una clase derivada … (2)

  • Consideraciones al redefinir métodos:
    • Cuando se heredan capacidades que no son necesarias deberían enmascararse redefiniendo los métodos correspondientes.
    • Todo lo que se requiere para redefinir un método es utilizar el nombre del método en la subclase, el mismo tipo de retorno y la misma lista de argumentos de llamada; además de proporcionar un código diferente y específico para las acciones que vaya a realizar sobre los objetos del tipo que origina (instancia) la nueva subclase.

Redefinición de métodos de una clase base en una clase derivada … (3)

  • Ejemplo típico de redefinición (sobre escritura) de un método en Java:
    • Este se da cuando se sobre escribe el método toString perteneciente a la clase Object (la clase raíz):
    • class CFraccion {
    • private int iNum;
    • private int iDen;
    • @Override
    • public String toString(){
    • String texto=iNum+" / "+iDen;
    • return texto;
    • }
    • }
    • Este método permite convertir los nuevos objetos a otros objetos de tipo String.

Redefinición de métodos de una clase base en una clase derivada … (4)

  • Una de las características más útiles de los LPOO es la posibilidad de declarar clases que definen cómo se utilizan solamente, sin tener que implementar métodos, son las clases abstractas.
  • Mediante una clase abstracta se intenta fijar un conjunto mínimo de métodos (el comportamiento) y de atributos, que permitan modelar cierto concepto, que será refinado y especializado mediante el mecanismo de la herencia.
  • Las clases abstractas contienen métodos abstractos, los cuales solo cuentan con la declaración, pero no con un cuerpo de código, por tanto su redefinición es obligatoria.

Constructores y destructores en clases derivadas.

  • Los constructores de las clases bases no son heredados por sus subclases.
  • Cuando se crea un objeto de una clase derivada, se invoca al constructor de dicha clase, el cual a su vez invoca al constructor sin parámetros de la clase base, que a su vez invoca al constructor sin parámetros de nivel superior y así sucesivamente.
  • Es posible invocar explícitamente al constructor de la superclase, desde el constructor de la subclase.
    • En Java se hace uso de la palabra reservada super , siendo esta la primera línea del constructor que invoca.

Constructores y destructores en clases derivadas … (2)

  • Si la superclase no tiene un constructor de forma explícita o tiene uno que no requiere parámetros, no se necesita invocarlo explícitamente ya que Java lo invoca automáticamente mediante super() sin argumento.
    • En este ejemplo el constructor si requiere de un parámetro:

Constructores y destructores en clases derivadas … (3)

  • Un constructor copia es un constructor que tiene un solo parámetro, que es una referencia a un objeto de su misma clase.
    • Es útil cuando se desea tener dos objetos con el mismo estado (valores de sus atributos), pero que en determinado momento su estado pueda cambiar sin afectarse mutuamente.
    • Ejemplo:
      • CCalendario obj1 = new CCalendario();
      • CCalendario obj2 = new CCalendario(23,11,2016);
      • CCalendario obj3 = obj2; //Ambos “apuntan” a un mismo objeto
      • La solución sería algo así:
      • CCalendario obj3 = new CCalendario(obj2);

Constructores y destructores en clases derivadas … (4)

  • Continuando con el ejemplo, un constructor copia para CCalendario sería algo así:
    • public CCalendario(final CCalendario obj){
    • dia = obj.dia;
    • mes = obj.mes;
    • año = obj.año;
    • }
  • ¿Pero qué pasaría si se ocupa un constructor copia en una clase derivada?

Conversión implícita de objetos de una clase derivada a objetos de una clase base

  • A pesar de que un objeto de una clase derivada “es un” objeto de la clase base, el tipo de clase derivada y el tipo de la clase base son distintos.
  • No obstante los objetos de las clases derivadas pueden ser tratados como objetos de la clase base. Esto tiene sentido ya que la clase derivada contiene todo lo de la clase base.

Conversión implícita de objetos de una clase derivada a objetos de una clase base … (2)

  • Java permite convertir implícitamente una referencia a un objeto de una subclase en una referencia a su superclase directa o indirecta.
  • Cuando se accede a un objeto de una subclase por medio de una referencia a su superclase, ese objeto solo puede ser manipulado por los métodos de su superclase.
  • Sin embargo, cuando se invoca a un método que está definido en la superclase y redefinido en sus subclases, la versión que se ejecuta depende de la clase de objeto referenciado, no del tipo de variable que lo referencia.

Conversión explícita de objetos de una clase base a objetos de una clase derivada

  • Asignar un objeto de la clase base a un objeto de una clase derivada dejaría sin definición a los miembros adicionales de la clase derivada.
  • Una forma de resolver esto es codificar de forma explícita un método de conversión para asignar los atributos comunes en ambas clases y colocar valores por omisión en los atributos propios de la clase derivada.
  • Sin embargo, dado que esta operación no es permitida en forma “natural”, no es común su implementación.

Herencia múltiple

  • Teóricamente una clase puede ser derivada a partir de más de una clase base; esta derivación se conoce como herencia múltiple.
  • Este tipo de herencia hace que la clase derivada herede y combine los atributos y métodos de varias clases base, lo cual puede representar un problema de ambigüedad.

Herencia múltiple … (2)

  • Java a diferencia de otros lenguajes orientados a objetos no permite la herencia múltiple.
  • Sin embargo, en C++, es posible implementar la herencia múltiple. La sintaxis sería la siguiente:
      • class D: claseA, claseB // class D: public A, public B
      • {
      • --
      • --
      • }

Interfaces

  • Las interfaces proporcionan un mecanismo para abstraer los métodos a un nivel superior, lo que permite simular la herencia múltiple de otros lenguajes de programación.
  • Una interfaz puede verse como una forma, un molde, que solo permite declarar los nombres de los métodos (con su lista de argumentos y tipo de retorno), además de datos miembro (pero solo de tipos básicos y serán tomados como constantes en tiempo de compilación).
  • Una interfaz contiene una colección de métodos que se implementan en otro lugar.

Interfaces … (2)

  • La diferencia principal entre interface y abstract es que una interfaz proporciona un mecanismo de encapsulación de los protocolos de los métodos sin forzar al usuario a utilizar la herencia.
    • Por ejemplo:
      • public interface VideoClip{
        • void play();
        • void stop();
      • }
    • Las clases que quieran utilizar la interfaz VideoClip utilizarán la palabra implements y proporcionarán el código necesario para implementar los métodos que se han definido para la interfaz:
      • class MiClase implements VideoClip{
        • void play(){
          • //código
        • }
        • void stop(){
          • //código
        • }
      • }

Interfaces … (3)

  • La ventaja principal del uso de interfaces es que una interface puede ser implementada por número de clases, permitiendo a cada clase compartir la interfaz de programación sin tener que ser consiente de la implementación que hagan las otras clases que implemente la interface:
      • class MiOtraClase implements VideoClip{
        • void play(){
          • //Otro código
        • }
        • void stop(){
          • //Otro código
        • }
      • }


La base de datos está protegida por derechos de autor ©absta.info 2016
enviar mensaje

    Página principal