Está en la página 1de 4

3.

1 Definición:
Clase base, clase derivada. La herencia es una propiedad esencial de la Programación Orientada a
Objetos que consiste en la creación de nuevas clases a partir de otras ya existentes. Este término
ha sido prestado de la Biología donde afirmamos que un niño tiene la cara de su padre, que ha
heredado ciertas facetas físicas o del comportamiento de sus progenitores. La herencia es la
característica fundamental que distingue un lenguaje orientado a objetos, como el C++ o Java, de
otro convencional como C, BASIC, etc. Java permite heredar a las clases características y conductas
de una o varias clases denominadas base. Las clases que heredan de clases base se denominan
derivadas, estas a su vez pueden ser clases bases para otras clases derivadas. Se establece así una
clasificación jerárquica, similar a la existente en Biología con los animales y las plantas. un ejemplo
del segundo tipo, que simule la utilización de liberías de clases para crear un interfaz gráfico de
usuario como Windows 3.1 o Windows 95. Supongamos que tenemos una clase que describe la
conducta de una ventana muy simple, aquella que no dispone de título en la parte superior, por
tanto no puede desplazarse, pero si cambiar de tamaño actuando con el ratón en los bordes
derecho e inferior. La clase Ventana tendrá los siguientes miembros dato: la posición x e y de la
ventana, de su esquina superior izquierda y las dimensiones de la ventana: ancho y alto. public
class Ventana { protected int x; protected int y; protected int ancho; protected int alto; public
Ventana(int x, int y, int ancho, int alto) { this.x=x; this.y=y; this.ancho=ancho; this.alto=alto; } //... }
La clase derivada Incrementamos la funcionalidad de la clase Ventana definiendo una clase
derivada denominada VentanaTitulo. Los objetos de dicha clase tendrán todas las características
de los objetos de la clase base, pero además tendrán un título, y se podran desplazar (se simula el
desplazamiento de una ventana con el ratón). La clase derivada heredará los miembros dato de la
clase base y las funciones miembro, y tendrá un miembro dato más, el título de la ventana. public
class VentanaTitulo extends Ventana{ protected String titulo; public VentanaTitulo(int x, int y, int
w, int h, String nombre) { super(x, y, w, h); titulo=nombre; }.

3.2 Clasificación: herencia simple, herencia múltiple:


Existen varios tipos de herencia entre clases en el lenguaje de programación C++. Estos son:
[editar]Herencia simple La herencia en C++ es un mecanismo de abstracción creado para poder
facilitar y mejorar el diseño de las clases de un programa. Con ella se pueden crear nuevas clases a
partir de clases ya hechas, siempre y cuando tengan un tipo de relación especial. En la herencia,
las clases derivadas "heredan" los datos y las funciones miembro de las clases base, pudiendo las
clases derivadas redefinir estos comportamientos (polimorfismo) y añadir comportamientos
nuevos propios de las clases derivadas. Para no romper el principio de encapsulamiento (ocultar
datos cuyo conocimiento no es necesario para el uso de las clases), se proporciona un nuevo modo
de visibilidad de los datos/funciones: "protected". Cualquier cosa que tenga visibilidad protected
se comportará como pública en la clase Base y en las que componen la jerarquía de herencia, y
como privada en las clases que NO sean de la jerarquía de la herencia. Herencia múltiple La
herencia múltiple es el mecanismo que permite al programador hacer clases derivadas a partir, no
de una sola clase base, sino de varias. Para entender esto mejor, pongamos un ejemplo: Cuando
ves a quien te atiende en una tienda, como persona que es, podrás suponer que puede hablar,
comer, andar, pero, por otro lado, como empleado que es, también podrás suponer que tiene un
jefe, que puede cobrarte dinero por la compra, que puede devolverte el cambio, etc.
3.3 Reutilización de miembros heredados:
La reutilización de código se refiere al comportamiento y a las técnicas que garantizan que una
parte o la totalidad de un programa informáticoexistente se pueda emplear en la construcción de
otro programa. De esta forma se aprovecha el trabajo anterior, se economiza tiempo, y se reduce
la redundancia. La manera más fácil de reutilizar código es copiarlo total o parcialmente desde el
programa antiguo al programa en desarrollo. Pero es trabajoso mantener múltiples copias del
mismo código, por lo que en general se elimina la redundancia dejando el código reusable en un
único lugar, y llamándolo desde los diferentes programas. Este proceso se conoce
comoabstracción. La abstracción puede verse claramente en las bibliotecas de software, en las que
se agrupan varias operaciones comunes a cierto dominio para facilitar el desarrollo de programas
nuevos. Hay bibliotecas para convertir información entre diferentes formatos conocidos, acceder a
dispositivos de almacenamiento externos, proporcionar una interfaz con otros programas,
manipular información de manera conocida (como números, fechas, o cadenas de texto). Para que
el código existente se pueda reutilizar, debe definir alguna forma de comunicación o interfaz. Esto
se puede dar por llamadas a una subrutina, a un objeto, o a una clase. Como se ha comentado
anteriormente la clase descendiente puede añadir sus propios atributos y métodos pero también
puede sustituir u ocultar los heredados. En concreto:

1. Se puede declarar un nuevo atributo con el mismo identificador que uno heredado, quedando
este atributo oculto. Esta técnica no es recomendable.

2. Se puede declarar un nuevo método de instancia con la misma cabecera que el de la clase
ascendiente, lo que supone su sobreescritura. Por lo tanto, la sobreescritura o redefinición
consiste en que métodos adicionales declarados en la clase descendiente con el mismo nombre,
tipo de dato devuelto y número y tipo de parámetros sustituyen a los heredados.

3. Se puede declarar un nuevo método de clase con la misma cabecera que el de la clase
ascendiente, lo que hace que éste quede oculto. Por lo tanto, los métodos de clase o estáticos
(declarados como static) no pueden ser redefinidos.

4. Un método declarado con el modificador final tampoco puede ser redefinido por una clase
derivada.

5. Se puede declarar un constructor de la subclase que llame al de la superclase de forma implícita


o de mediante la palabra reservada super.

6. En general puede accederse a los métodos de la clase ascendiente que han sido redefinidos
empleando la palabra reservada super delante del identificador del método. Este mecanismo sólo
permite acceder al metodo perteneciente a la clase en el nivel inmediatamente superior de la
jerarquía de clases. La llamada al método super indica que estamos llamando a un constructor de
la clase base (pensemos que un Taxista antes que Taxista es Persona y por tanto tiene sentido
llamar al constructor de Persona antes que al de Taxista). Además gracias al número de
parámetros de la llamada a super podemos especificar cuál de los constructores de la clase base
queremos llamar. En java se pueden emplear dos palabras clave: this y super . Como vimos en la
introducción a la programación orientada a objetos, this hace alusión a todo el objeto y super hace
alusión a la parte heredada, por ello empleamos super para referenciar al constructor de la clase
base. En java los atributos y métodos de la clase base pueden cambiar su modificador de
visibilidad dentro de la clase derivada, la siguiente tabla recoge dichos cambios: Modificadores en
la clase base public private protected paquete En la clase derivada se transforman en public
inaccesible protected paquete Inaccesible significa que, a pesar de haber sido heredado, no hay
permisos en la clase derivada para poder acceder a dicho elemento inaccesible, pero aún así, se
pueden llamar a métodos de la clase base que si pueden acceder y modificar al elemento.
Recordemos que protected significa que es private, pero que al heredar no se hace inaccesible, es
decir que desde la clase derivada se puede acceder.

3.4 Referencia al objeto de la clase base:


LA JERARQUÍA DE CLASES QUE DESCRIBEN LAS FIGURAS PLANAS Consideremos las figuras planas
cerradas como el rectángulo, y el círculo. Tales figuras comparten características comunes como es
la posición de la figura, de su centro, y el área de la figura, aunque el procedimiento para calcular
dicha área sea completamente distinto. Podemos por tanto, diseñar una jerarquía de clases, tal
que la clase base denominada Figura, tenga las características comunes y cada clase derivada las
específicas. La relación jerárquica se muestra en la figura La clase Figura es la que contiene las
características comunes a dichas figuras concretas por tanto, no tiene forma ni tiene área. Esto lo
expresamos declarando Figura como una clase abstracta, declarando la función miembroarea
abstract. Las clases abstractas solamente se pueden usar como clases base para otras clases. No se
pueden crear objetos pertenecientes a una clase abstracta. Sin embargo, se pueden declarar
variables de dichas clases. En el juego del ajedrez podemos definir una clase base denominada
Pieza, con las características comunes a todas las piezas, como es su posición en el tablero, y
derivar de ella las características específicas de cada pieza particular. Así pues, la clase Pieza será
una clase abstracta con una función abstractdenominada mover, y cada tipo de pieza definirá
dicha función de acuerdo a las reglas de su movimiento sobre el tablero. • La clase Figura La
definición de la clase abstracta Figura, contiene la posición x e y de la figura particular, de su
centro, y la función area, que se va a definir en las clases derivadas para calcular el área de cada
figura en particular. public abstract class Figura { protected int x; protected int y; public Figura(int
x, int y) { this.x=x; this.y=y; } public abstract double area(); } • La clase Rectangulo Las clases
derivadas heredan los miembros dato x e y de la clase base, y definen la función area, declarada
abstract en la clase base Figura, ya que cada figura particular tiene una fórmula distinta para
calcular su área. Por ejemplo, la clase derivada Rectangulo, tiene como datos, aparte de su
posición(x, y) en el plano, sus dimensiones, es decir, su anchura ancho y altura alto. class
Rectangulo extends Figura{ protected double ancho, alto; public Rectangulo(int x, int y, double
ancho, double alto){ super(x,y); this.ancho=ancho; this.alto=alto; } public double area(){ return
ancho*alto; } } La primera sentencia en el constructor de la clase derivada es una llamada al
constructor de la clase base, para ello se emplea la palabra reservada super. El constructor de la
clase derivada llama al constructor de la clase base y le pasa las coordenadas del punto x e y.
Después inicializa sus miembros datoancho y alto. En la definición de la función area, se calcula el
área del rectángulo como producto de la anchura por la altura, y se devuelve el resultado • La
clase Circulo class Circulo extends Figura{ protected double radio; public Circulo(int x, int y, double
radio){ super(x,y); this.radio=radio; } public double area(){ return Math.PI*radio*radio; } } Como
vemos, la primera sentencia en el constructor de la clase derivada es una llamada al constructor
de la clase base empleando la palabara reservadasuper. Posteriormente, se inicializa el miembro
dato radio, de la clase derivada Circulo. En la definición de la función area, se calcula el área del
círculo mediante la conocida fórmula r2, o bien *r*r. La constante Math.PI es una
aproximación decimal del número irracional . USO DE LA JERARQUÍA DE CLASES Creamos un
objeto c de la clase Circulo situado en el punto (0, 0) y de 5.5 unidades de radio. Calculamos y
mostramos el valor de su área. Circulo c=new Circulo(0, 0, 5.5); System.out.println("Area del
círculo "+c.area()); Creamos un objeto r de la clase Rectangulo situado en el punto (0, 0) y de
dimensiones 5.5 de anchura y 2 unidades de largo. Calculamos y mostramos el valor de su área.
Rectangulo r=new Rectangulo(0, 0, 5.5, 2.0); System.out.println("Area del rectángulo "+r.area());
Veamos ahora, una forma alternativa, guardamos el valor devuelto por newal crear objetos de las
clases derivadas en una variable f del tipo Figura (clase base). Figura f=new Circulo(0, 0, 5.5);
System.out.println("Area del círculo "+f.area()); f=new Rectangulo(0, 0, 5.5, 2.0);
System.out.println("Area del rectángulo "+f.area());

3.5 Constructores y destructores en clases derivadas:


Constructores en clases derivadas Al instanciar objetos de clases derivadas se inicia una cadena de
invocaciones a constructores en las cuales el constructor de la clase derivada, antes de realizar sus
propias tareas, invoca (ya sea implícita o explícitamente) al constructor de su clase base.
Similarmente, si la clase base fue derivada de otra clase, el constructor de la clase base debe
invocar al constructor de la clase ubicada en el siguiente nivel superior de la jerarquía, y así
sucesivamente. El último constructor invocado en la cadena es el constructor de la clase Object,
cuyo cuerpo se ejecuta primero. El cuerpo del constructor de la clase derivada se ejecuta al final. El
constructor de cada clase base inicializa las variables de instancia que el objeto de la clase
derivada hereda. Destructores en clases derivadas Cuando remueve de la memoria un objeto de
una clase derivada, el recolector de basura invoca al destructor del objeto. Esto inicia una cadena
de invocaciones a destructores, en donde el destructor de la clase derivada y los destructores de
las clases bases directas e indirectas se ejecutan en orden inverso al que se ejecutaron los
constructores, esto es, primero se ejecuta el destructor de la clase derivada y al final se ejecuta el
destructor de la clase base ubicada en el nivel superior de la jerarquía. La ejecución de los
destructores debe liberar todos los recursos que el objeto adquirió, antes de que el recolector de
basura reclame la memoria de ese objeto. Cuando el recolector de basura invoca al destructor de
un objeto de una clase derivada, ese destructor realiza su tarea y después invoca al destructor de
la clase base.

3.6 Redefinición de métodos en clases derivadas:


Redefinicion de las clases derivadas El lenguaje java permite redefinir miembros de la clase base
en las clases derivadas, pero el compilador emite una advertencia cuando detecta una
redefinición. Una advertencia (warning) es un mensaje del compilador acerca de un posible
problema. Sin embargo, en este caso sí se genera código ejecutable (a diferencia del mensaje de
error). Redefinición de campos.

También podría gustarte