Bienvenidos.
Continuamos con el concepto de herencia en Yaba.
Bien, pero muy parecido a la vida real cuando tenemos relaciones de parentesco entre padre e hijo.
Bueno, se pueden heredar muchas características genéticas.
Por ejemplo, se puede traspasar del padre al hijo, ya sea el color de pelo, altura, contextura,
color de ojo, en fin, un montón de cosas color de la piel.
Y se pueden traspasar no solamente de padre e hijo, sino también de generación en generación.
Característica de la abuela o el abuelo que lo puede heredar.
También los nietos.
Comportamiento, por ejemplo, los mismo gustos, preferencias.
Por ejemplo, si el padre es bueno para el deporte, probablemente el hijo también sea bueno para el
deporte.
En fin, son cosas que se van heredando.
Pero también vamos a ver que no todo es exactamente igual.
Quizás haya comportamiento que variedad, pero concierto, modificación, concierto, cambio.
En fin, quizá en el deporte el hijo incluso sea más rápido que el padre tenga mucho mejor rendimiento.
Pero bien.
Lo importante que igual que en la vida real, la herencia también la podemos aplicar en la programación
orienta objetos.
Bien, qué es la herencia?
Una relación de parentesco entre dos clases donde unas el padre y la otra en la hija, una relación
familiar.
Entonces la herencia es el mecanismo que tiene la programación orientada a objetos para implementar
relaciones de jerarquía de clases.
Una subclase hereda al Estado, que son las características, los atributos y también comportamiento
de todos sus ancestros.
Es decir, no solamente del ancestro más directo, sino también de la jerarquía completa.
También vamos a ver que una clase hija puede heredar de una sola clase a la vez, puede tener un padre
directo 1.
Pero obviamente hay una jerarquía va a tener un abuelo, un bisabuelo.
En fin.
Y ese comportamiento y atributos se van heredando también de generación en generación.
Bueno, y acá entra el polimorfismo, una de las bases de reutilización de código.
Acá podemos implementar clase con comportamiento en común que se pueden heredar a otras clases, clases,
hijas y es importante porque podemos tener clases genéricas reutilizable.
Y también uno de los principios o de los 5 principales principios de la programación de orientÃ objeto
es justamente la herencia.
Bien, y acá hay un tema importante que es relacionado al parentesco entre clases.
Es decir, no se puede aplicar herencia si no existe una relación familiar entre ambas clases.
Uno de los peores errores que se puede cometer es usar la herencia como único objetivo de reutilizar
código.
La herencia no se debe aplicar de forma mecánica si no hay una relación literal y coherente de padre
e hijo.
Igual que en la vida real.
Es decir.
Si no hay una relación familiar de parentesco.
La herencia simplemente nos aplica porque por ejemplo, por el puro hecho de querer reutilizar código,
podríamos heredar un producto.
Por ejemplo, un producto o un cliente o persona.
Cualquier objeto de la clase conexión a la base auto solamente para reutilizar la conexión y conectarnos
y realizar consulta en esta clase.
En la clase, por ejemplo cliente es un error de diseño, porque en realidad un cliente no tiene nada
que ver con una conexión al acetato.
Un producto no es una base auto, no es una conexión, no tiene nada que ver.
Entonces tiene que ver una relación literal, coherente con la realidad.
Una relación familiar, por ejemplo, cliente con persona puede ser.
Se fijan, tiene que haber una relación de parentesco entre la clase.
Veamos algunos ejemplo herencia.
Bien, lo más importante en el código tenemos que utilizar la palabra stents, una palabra clave.
Por ejemplo, la clase persona cualquiera con cualquier implementación.
Pero también podríamos tener la clase profesor.
Y para qué esta hereda de persona.
Tenemos que utilizar la palabra stents, pero también como tenemos profesor, también podemos tener
director y alumno.
Y estas tres clases que son muy particulares, son especializaciones de persona, heredan de persona
y pueden compartir todo esto.
Métodos, comportamiento y características atributos de la clase persona.
Todos tienen en común ciertos atributos y cierto comportamiento y lo heredan y lo pueden utilizar como
si fueran parte de la misma clase.
Pero también, por ejemplo, podríamos tener alumno internacional que también hereda extends de alumno.
Por lo tanto, alumno internacional tiene como padre alumno, pero a su vez tiene como abuelo, como
ancestro que no es directo a la persona.
Entonces importante que directamente siempre hereda de una sola clase, pero indirectamente, es decir,
a través de la jerarquía, puede heredar demás clases, pero siempre uno a la vez.
Cuando una clase, por ejemplo persona, no hereda de ninguna clase.
Bueno, en Java de forma implícita y por debajo, porque esto no se ve y esto ya lo he hablado muchas
veces, se extiende de la clase objeto.
Por lo tanto, la clase Object es padre de todas las clases en Java, en este caso persona de forma
implícita hereda de objeto, pero a su vez profesor hereda de persona, pero de forma indirecta también
va a heredar de object, ya que persona hereda de octeto.
Otro ejemplo figura geométrica.
Por ejemplo tenemos cuadrado triángulo círculo.
Y todas heredan de figura geométrica.
Pero recuerda, en figura geométrica, a su vez hereda de la clase Object de forma implícita y por supuesto
cuadrado y triángulo también, pero de forma indirecta va a heredar de ответы.
Veamos el diagrama súmele.
Cómo se puede reflejar esta relación en el diseño?
Lo primero es una relación que se le conoce como generalización, una relación de padre e hijo, y es
una flecha continua, completamente continua.
Pero a diferencia de la relación de asociación que vimos cuando es un atributo acá, en vez de terminar
en flecha, termina en un triángulo, en un triángulo completamente cerrado y blanco.
Y también es una relación fuerte, estructural.
Nos permite crear, implementar objetos mucho más grandes, complejos, pero que a su vez tan compuesto
por objetos más simples.
En este caso, mediante la herencia.
Bien, acá tenemos la clase persona con sus propios atributos, por ejemplo, nombre, apellido y mail.
Y estos atributos pueden ser en común a muchas otras clases, clases, hijas que pueden heredar de persona,
por ejemplo, alumno, alumno.
Es un tipo de persona.
Por lo tanto hereda de la clase persona de forma automática.
Todos los atributos y métodos que son públicos y protegidos se pueden acceder desde la clase hija bueno
y público.
Se pueden acceder desde cualquier parte, pero no solamente los públicos y protegidos se pueden acceder,
sino también los que son default.
Cuando no se coloca ningún modifi, cortás eso, pero siempre cuando la clase padre y la clase hija
estén dentro del mismo package alumno va a poder reutilizar y hereda todos estos atributos y métodos
que son públicos y protegidos como si fueran parte de su propia clase.
Pero además va a implementar sus propios atributos más específicos.
Por ejemplo, el promedio institución, nota matemática, nota castellano, nota de historia, atributos
que son particulares de alumno y además va a tener también su propio método getter setter y métodos
de qué tipo de operaciones?
También sus constructores.
También va a poder heredar lo constructor, el padre, pero no de forma directa.
No puede utilizar de forma directa el constructor si no tiene que implementar su propio constructor
y ahí utilizar el constructor del padre para inicializar los datos o atributos que hereda del padre,
por ejemplo, nombre, apellido y todos los atributos.
El método que sea en privado es el privado.
En la clase padre no se heredan en la clase hija.
No se puede utilizar, no se puede acceder a menos que sea a través de métodos público.
Por ejemplo, a través de los getter setter del constructor y por ejemplo del método String.
El hijo podría utilizar el constructor del padre internamente porque constructor el padre público para
asignar el nombre y el apellido y mediante los métodos get o el String podría acceder a estos atributos,
pero de forma indirecta, no directa.
Hay dos formas para implementar o hacer la herencia.
Por un lado tenemos la generalización y por otro la especialización.
Cuando nos damos cuenta que tenemos dos o más clases con atributos y con métodos en común que se están
repitiendo, por ejemplo nombre, apellido, algún método en particular que se repiten en una y en otra
clase.
Bueno, hoy nos damos cuenta de que tenemos que refactorizar estos código en común y llevarlo a una
clase más general.
Por eso se le conoce como generalización.
La llevamos a una clase padre y ahí implementamos todo lo que tengan en común.
Estas clases y clases hijas heredan del padre.
Entonces, a partir de clases hijas podemos implementar la herencia hacia una clase padre.
La especialización sería otra forma de crear la herencia.
O este proceso de herencia.
Y esto al revés.
Por ejemplo, cuando tenemos una clase que la estamos utilizando en nuestra aplicación y de repente
nos damos cuenta que necesitamos otra clase muy parecida, pero más específica, mucho más particular,
con otros atributos y otro método.
Pero lo que sí va a tener algunas características en común a esta primera clase.
Entonces lo que hacemos es derivar a una clase más específica, más especializada, y eso es el proceso
de herencia mediante la especialización.
Veamos algún ejemplo.
Imaginemos que tenemos la clase de persona.
La estamos utilizando en nuestro proyecto, en nuestro código ya tenemos algunas características implementadas
y de repente nos damos cuenta que necesitamos un tipo de persona más específica, por ejemplo, alumno
con otros atributos, pero que también comparten atributos en común.
Entonces, bueno, ahí tenemos que crear a partir de persona una clase más particular.
Y así como tenemos alumnos, también nos podríamos dar cuenta de que vamos a requerir una clase profesor,
pero tanto alumno como profesor y persona van a tener métodos y atributos en común.
Y acá hay un principio de la programación orienta objetos que se le conoce como open cloud, abierto
a la extensión, a la herencia, cerrado a la modificación.
Qué es lo que quiere decir?
Que en vez de modificar persona con esta nueva característica nuevo cambio, ya que persona está funcionando
con nuestro código, ya te ha implementado.
Entonces, si agrego cambio, podría romper nuestra aplicación?
Podría dejar de funcionar entonces?
Mejor dejar persona como está.
E implementar herencia, una nueva clase más específica alumno y no modifica de persona si no está en
tela y por eso se llama Open Clouds, tratar de evitar la modificación.
De esa forma evitamos que nuestro código que ya funciona se puede romper.
Veamos un ejemplo de generalización.
Todo lo contrario.
Supongamos que tenemos dos clases al mismo nivel y sin ninguna relación entre ellas.
Son completamente distintas y separadas, por ejemplo, alumno y profesor.
Y nos damos cuenta que estamos repitiendo código, que tenemos atributos en común.
El nombre, el apellido, los métodos tras setters se fijan entonces bueno, para no repetir código,
si realizamos estos comportamientos y característica en una clase en común que le vamos, se llama persona.
De esa forma podemos reutilizar nuestro código, sea mucho más limpio, más simple.
También con este comportamiento genérico y en común ven la palabra shuper, una palabra muy importante,
reservada en la herencia, reservada al lenguaje.
Bueno, supers, se refiere que una clase hija puede reutilizar o invocar atributos y métodos de la
clase padre.
Recuerden que con this siempre podemos utilizar atributos y métodos dentro de la misma clase con super.
Entonces se refiere a la clase padre, como por ejemplo si en la clase hija alumno quiero reutilizar
el constructo del padre para asignar el nombre y apellido.
Recuerden que el nombre apellido es private en persona.
Por lo tanto, alumno o cualquier clase hija no puede utilizar estos atributos.
No puede acceder, pero sí lo puede inicializar a través de constructor del padre, ya que público entonces
para puede invocar el constructor.
Utilizamos super alumno hereda de persona y tiene constructor que recibe el nombre, el apellido, pero
también el promedio.
El promedio sería un atributo particular de alumno, pero nombre apellido son atributos en común con
persona.
Entonces utilizando shuper puede pasar el nombre y el apellido al padre.
A pesar de que privado, pero como el constructor es público se puede asignar y además luego después
de invocar el súper ya puedo asignar el promedio con this, ya que propio de la clase alumno.
También es muy importante que siempre el super.
En el caso de constructor se tiene que invocar primero antes que nada como primera línea en el constructor,
es decir, no se puede llamar el super.
Por ejemplo, después de asignar el promedio no primero, siempre se invoca constructor del padre y
luego los atributo más específico de la clase y luego podemos utilizar el constructor de alumno como
si fuera propio.
Se pondrá usar el nombre Lupillo y además el promedio en nombre en este caso 3.
El apellido Guzmán se inicializa en el padre con super.
Entonces la palabra super muy importante la vamos a ver después con más detalle en los ejemplos.
Otra característica de la herencia es poder sobrescribir o modificar un método del padre.
Un comportamiento padre no tiene por qué ser igual que en la clase hija.
Podría tener variantes, ya sea completamente distinto.
Bueno, esa la gracia del polimorfismo diferente forma para implementar un mismo comportamiento o bien
podría mantener algo del padre y agregar una nueva característica a este comportamiento.
Bien, veamos el ejemplo.
Entonces acá tenemos alumno hereda de padre, implementa el mismo método?
Si tiene que llamar exactamente igual.
Public void Mimmo modificador mismo nombre método mismo retorno, argumento parámetro tiene que ser
exactamente igual.
Y además lleva el hover right, que es una anotación para indicar y documentar de que estamos o describiendo
un método del padre.
Si queremos mantener la característica al padre y le queremos agregar funcionalidad extra, en ese caso
también podemos utilizar el super.
Entonces mantenemos comportamiento original del padre, pero además le podemos agregar un extra en la
clase hija.
Entonces Ciria con super invocamos método al padre, lo mandamos a llamar y luego después de eso le
agregamos.
Bueno, puede ser después o antes.
En el caso un método da lo mismo.
En el caso constructor siempre es lo primero, el súper primero.
En el caso un método puede ir antes o después y le agregamos nuestra propia implementación.
También podemos sobrescribir el string.
Por ejemplo, si queremos reutilizar el streak del padre, también lo podemos invocar con el súper.
Por ejemplo persona.
El twitt Frink retorna el nombre Lupillo, pero el alumno con súper punto tu string.
Mantenemos el nombre de apellido a través del Tustin del padre con el super y además le agregamos el
promedio.
Entonces el tustin del alumno sería nombre apellido coma el promedio igual a su valor.
Y también podemos editar o restringir la herencia y la sobre escritura de método.
Entonces, para impedir que una clase tenga una jerarquía tenga hijos, simplemente utilizamos la palabra
final como modificador de la clase, por ejemplo final.
Public class persona.
Entonces, al indicar que es final, esta clase queda hasta ahí nomás.
No puede tener descendencia mismo.
Modificador final para.
Constante, una constante no se puede modificar.
En este caso, una clase tampoco se puede modificar.
No puede tener herencia.
Se fijan, se aplica exactamente el mismo modificador.
Para mí mi concepto no se puede modificar, la clase no puede tener una jerarquía.
Y pasa también lo mismo con la sobreexcitada de método.
Podríamos tener, por ejemplo, una clase común y corriente public class persona bueno soporta herencia,
podemos heredar de persona, pero el o los métodos que tengan el modificador final no se pueden modificar.
Es decir, no se puede sobreescribir ese método.
La clase hija no puede reimplantar o redefinir el método del padre.
Entonces colocamos final como modificador en el método el padre de esa forma.
Ese método no se puede modificar, es constante.
Se tiene que utilizar de esa forma para toda la jerarquía.
Nada más.
Continuamos en la siguiente clase con los ejemplos.