Академический Документы
Профессиональный Документы
Культура Документы
Resumen
La herencia ofrece una ventaja importante, permite la reutilización del código. Una
vez que una clase ha sido depurada y probada, el código fuente de dicha clase no
necesita modificarse. Su funcionalidad se puede cambiar derivando una nueva
clase que herede la funcionalidad de la clase base y le añada otros
comportamientos. Reutilizando el código existente, el programador ahorra tiempo y
dinero, ya que solamente tiene que verificar la nueva conducta que proporciona la
clase derivada.
Clase base
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.
Clase derivada
La clase derivada heredará los miembros dato de la clase base y las funciones
miembros, y tendrá un miembro dato más, el título de la ventana.
super(x, y, w, h);
titulo=nombre; }
x+=dx;
y+=dy; }
Redefine la función miembro mostrar para mostrar una ventana con un título.
super.mostrar();
System.out.println("titulo : "+titulo); }
TECNOLÓGICO NACIONAL DE MÉXICO
En la clase derivada se define una función que tiene el mismo nombre y los mismos
parámetros que la de la clase base. Se dice que redefinimos la función mostrar en
la clase derivada. La función miembro mostrar de la clase
derivada VentanaTitulo hace una llamada a la función mostrar de la clase
base Ventana, mediante super.mostrar();
System.out.println("titulo : "+titulo);
mostrar(); }
Herencia simple
class Vehiculo {
TECNOLÓGICO NACIONAL DE MÉXICO
public:
void avanza() {}
};
class Coche : public Vehiculo {
public:
void avanza(void)
{ cout << "Avanza coche." << endl; }
};
class Moto: public Vehiculo {
public:
void avanza(void)
{ cout << "Avanza moto." << endl; }
};
int main()
{
Moto t;
Coche c;
t.avanza();
c.avanza();
return 0;
}
Esta es la herencia más útil y típica. Existen otros tipos de herencia marginales en
C++, que se describen a continuación, pero que en la práctica son poco útiles.
Herencia múltiple
En algún momento, un programador puede estar tentado a derivar una clase única
de varias clases. Esto se conoce como "herencia múltiple" y aunque parece útil,
puede provocar problemas, como el importante "problema del diamante". Este
problema ocurre cuando dos clases heredan de la misma clase (como la clase B y
C derivan de la clase A), mientras que otra clase (D) deriva de B y C. Cuando se
TECNOLÓGICO NACIONAL DE MÉXICO
crea un objeto D, el sistema lo trata como un tipo de clase base (clase "Ball" o bola
y "Sphere" o esfera, por ejemplo). En el problema del diamante, el sistema no puede
determinar de forma decisiva qué clase D (¿es tipo A-B-D o tipo A-C-D?) es la que
causa problemas.
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 como abstracció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.
System.out.println(tax1.getEdad());
}
}
Ahora intentemos usar el constructor que existía en la clase Persona que recibia el
nombre de la persona y vamos a usarlo para la clase Taxista. Para ello
construyamos la clase ArranqueTaxista2.java:
(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
unidad 1, 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. Ahora
vamos a agregar la función getNombre dentro de la clase Taxista, es decir, tenemos
la misma función en Persona y en Taxista:
Public
Private
Protected
Paquete
Public
TECNOLÓGICO NACIONAL DE MÉXICO
inaccesible
protected
paquete
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.
public int X
{ get { return x; }
set { x = value; }
}
public int Y
{
get { return y; }
set { y = value; }
}
}
Una nueva clase, denominada ColorCoOrds, hereda todos los campos y métodos
de la clase base, a la cual se pueden agregar nuevos campos y métodos para
proporcionar características adicionales en la clase derivada, según sea necesario.
En este ejemplo, se agrega un miembro privado y descriptores de acceso para
agregar color a la clase:
public class ColorCoOrds : CoOrds
{ private System.Drawing.Color screenColor;
public ColorCoOrds() // constructor
{ screenColor = System.Drawing.Color.Red; }
public System.Drawing.Color ScreenColor
{ get { return screenColor; }
set { screenColor = value; }
}
}
El constructor de la clase derivada llama implícitamente al constructor de la clase
base o la superclase, en terminología de Java. En caso de herencia, se llama a
todos los constructores de clase base antes que a los constructores de la clase
derivada en el orden en que las clases aparecen en la jerarquía de clases.
TECNOLÓGICO NACIONAL DE MÉXICO
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. El siguiente ejemplo muestra cómo reutilizar los
identificadores de los campos de la clase base en una clase derivada.
Ejemplo de redefinición de las clases derivadas
// Redef.cs : Ejemplifica la redefinición de campos en clases derivadas.
class Punto{
public int x;
public int y;}
class Punto3D : Punto{
public int x ;
public int y ;
public int z ;
}
class Principal{
TECNOLÓGICO NACIONAL DE MÉXICO
Bibliografía
https://es.ccm.net/contents/411-poo-herencia
http://www.sc.ehu.es/sbweb/fisica/cursoJava/fundamentos/herencia/herencia.htm
http://pooitzo.blogspot.com/2012/06/35-constructores-y-destructores-en.html
http://jbgarcia.webs.uvigo.es/asignaturas/TO/cursilloCpp/15_herencia_simple.html
https://techlandia.com/herencia-multiple-java-info_269416/
http://fjglez90.blogspot.com/2012/06/36-redefinicion-de-metodos-en-clases.html