"¡Hola, Amigo! Ahora aquí hay un tema que creo que usarás mucho. Estoy hablando de la herencia " .

Para los no iniciados, la programación es como magia. Así que permítanme comenzar con una analogía...

Supongamos que eres un mago que quiere crear un caballo volador. Podrías intentar conjurar un Pegaso. Pero como los caballos voladores no ocurren naturalmente, lo pasarás muy mal. Tendrías mucho trabajo que hacer. Sería mucho más fácil comenzar con un caballo y convocar algunas alas.

Herencia.  Ventajas de la herencia - 1

En programación, a este proceso lo llamamos «herencia» . Suponga que necesita escribir una clase muy compleja. Podría pasar mucho tiempo escribiendo código desde cero y luego realizar largas pruebas para encontrar errores. Pero, ¿por qué hacerlo de la manera difícil? ¿Es mejor mirar alrededor y ver si la clase que estás buscando ya existe?

Digamos que encuentra una clase que implementa el 80% de la funcionalidad que necesita. Simplemente puede copiar su código en su clase. Pero eso tendría varios inconvenientes:

1) Es posible que la clase que encuentre ya esté compilada en código de bytes. Es posible que no tenga acceso a su código fuente.

2) Es posible que tenga el código fuente de la clase, pero también trabaje en una empresa que podría ser demandada por un par de miles de millones si usa incluso 6 líneas del código de otra persona. Y luego te demandarán.

3) Esto conduce a la duplicación innecesaria de muchos códigos. Y si el autor de la otra clase encuentra un error y lo corrige, todavía tienes el error.

Hay una solución más elegante que no requiere obtener permiso legal para el código de la clase original. En Java, simplemente puede declarar la otra clase como el padre de su clase. Esto es equivalente a agregar el código de esa clase a su propia clase. Todos los datos y métodos de la clase principal aparecerán en su clase. Por ejemplo, podrías heredar de un «caballo», agregarle «alas» y obtener un «Pegaso».

Herencia.  Ventajas de la herencia - 2

"Muy interesante. Por favor, continúa".

"La herencia también tiene otros usos. Suponga que tiene diez clases que son muy similares. Tienen datos y métodos coincidentes. Podría crear una clase base especial , mover los datos (y los métodos asociados) a la clase base y tener esas diez clases heredar de él. En otras palabras, para cada clase, usted indica que tiene una clase principal, también conocida como clase base".

"Así como las ventajas de la abstracción solo se revelan verdaderamente en relación con la encapsulación, las ventajas de la herencia se magnifican con el polimorfismo. Pero mañana les contaré sobre eso. Hoy veamos algunos ejemplos de herencia".

"Supongamos que estamos escribiendo un programa de ajedrez. Necesitaremos clases para las piezas de ajedrez. ¿Qué clases sugieres, Amigo?"

"Rey, Reina, Alfil, Caballo, Torre y Peón".

"Muy bien. No te perdiste nada".

"¿Y qué datos sugeriría almacenar en estas clases?"

"La posición en el tablero de cada pieza (x e y) y su valor. Después de todo, algunas piezas son más valiosas que otras".

"¿Y cuáles son las diferencias entre estas clases?"

"Se diferencian en cómo mueven las piezas. En su comportamiento".

"Sí. Podrías definirlos como clases como esta:"

class King
{
int x;
int y;
int worth;
void kingMove()
{
//code that defines,
//how the king moves
}
}
class Queen
{
int x;
int y;
int worth;
void queenMove()
{
//code that defines,
//how the queen moves
}
}
class Rook
{
int x;
int y;
int worth;
void rookMove()
{
//code that defines,
//how the rook moves
}
}
class Knight
{
int x;
int y;
int worth;
void knightMove()
{
//code that defines,
//how the knight moves
}
}
class Bishop
{
int x;
int y;
int worth;
void bishopMove()
{
//code that defines,
//how the bishop moves
}
}
class Pawn
{
int x;
int y;
int worth;
void pawnMove()
{
//code that defines,
//how the pawn moves
}
}

"Sí, así es exactamente como lo escribiría".

"Pero mira cómo podrías usar la herencia para escribir menos código. Podemos mover métodos y datos idénticos a una clase común. Llamémosla ChessItem. No tiene sentido crear objetos ChessItem, ya que no corresponden a ninguna clase". pieza de ajedrez. Pero la clase sería de gran ayuda:"

class King extends ChessItem
{
void kingMove()
{
//code that defines,
//how the king moves
}
}
class Queen extends ChessItem
{
void queenMove()
{
//code that defines,
//how the queen moves
}
}
class Rook extends ChessItem
{
void rookMove()
{
//code that defines,
//how the rook moves
}
}
 class ChessItem
{
int x;
int y;
int worth;
}
 
class Knight extends ChessItem
{
void knightMove()
{
//code that defines,
//how the knight moves
}
}
class Bishop extends ChessItem
{
void bishopMove()
{
//code that defines,
//how the bishop moves
}
}
class Pawn extends ChessItem
{
void pawnMove()
{
//code that defines,
//how the pawn moves
}
}

"¡Que interesante!"

"¡Absolutamente! El beneficio es especialmente grande en proyectos que contienen miles de objetos diferentes y cientos de clases. En este caso, las clases elegidas correctamente no solo pueden simplificar significativamente la lógica, sino también reducir el código requerido por un factor de diez".

"Entonces, ¿qué tienes que hacer para heredar una clase?"

"Después de declarar una clase, usamos la palabra clave ' extiende ', seguida del nombre de la clase principal. Solo puede heredar de una clase " .

Herencia.  Ventajas de la herencia - 3

La imagen muestra una "vaca" que ha heredado de un «cerdo». El «Cerdo» hereda del «pollo», y el «pollo» hereda del «huevo». ¡Cada clase tiene un solo padre! Tal herencia no siempre es lógica. Si solo tienes un cerdo, pero realmente necesitas una vaca, los programadores a menudo no pueden resistir el deseo de convertir el "cerdo" en una "vaca".

"¿Pero qué pasa si quiero heredar de dos clases? ¿Hay algo que pueda hacer?"

"En realidad, no. Las clases de Java no admiten la herencia múltiple de implementación: una clase solo puede tener una sola clase principal. Pero hay herencia múltiple de tipo, lo que significa que una clase puede implementar más de una interfaz. Esto mitiga ligeramente el problema. "

"Ya veo. ¿Y qué es una interfaz?"

"Te hablaré de las interfaces mañana. Por ahora, sigamos profundizando en la herencia".