20250121 Herencia_ClasesAbstractas_1 - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Vamos a acabar esta aplicación que estamos muy hartos y aburridos de hacer lo mismo una y otra vez.
00:00:00
¡Hala! Pues ya está.
00:00:05
Ahora ya vamos a hacer una aplicación, vamos a hacer un main.
00:00:06
El main, en este caso, cambia respecto al que teníamos de pruebas,
00:00:11
porque nosotros en nuestro main original, en nuestra aplicación,
00:00:18
nuestro main trabajaba con un único departamento
00:00:23
y ahora ya nuestro main agregaba
00:00:27
empleado a ese único departamento
00:00:29
etcétera, vale
00:00:31
entonces, vamos a dejar
00:00:33
este main así
00:00:35
empleado temporal tiene sus getsuse
00:00:39
y no tenía nada más
00:00:45
no, ok
00:00:46
Aquí está
00:00:47
Echa el otro día
00:01:01
Esto lo escribimos el otro día
00:01:03
Y nos fuimos con ello ya escrito
00:01:06
Sí
00:01:08
Ah, pero pensaba que eso era de la empresa
00:01:09
Ah, espera un momento
00:01:12
Este es nuestro antiguo mail
00:01:14
entonces al que acabo de entrar
00:01:15
y nuestro antiguo main
00:01:17
nuestro antiguo main
00:01:19
lo hicimos para hacer pruebas
00:01:24
con las clases que teníamos hasta ese momento
00:01:25
que eran departamento, gerente y empleado
00:01:27
pues nos creamos
00:01:30
un departamento
00:01:31
y agregamos empleados al departamento
00:01:32
y mostramos el total del departamento
00:01:35
¿vale? vamos a hacernos
00:01:37
un main 2, bueno lo vamos a dejar esbozado
00:01:39
ya lo completáis vosotros para que podamos
00:01:42
pasar a otro ejercicio
00:01:43
vamos a dejar ya un main 2
00:01:44
esbozado, que ya sería el main
00:01:47
que me piden en el ejercicio
00:01:49
pues venga, nos vamos a hacer una clase
00:01:51
bueno, vamos a llamar
00:01:54
vamos a refactorizar la anterior
00:02:03
para que sea main pruebas
00:02:05
porque es el main que hicimos el otro día para probar
00:02:06
las clases que teníamos
00:02:09
entonces a mi clase main antigua
00:02:10
le voy a cambiar el nombre
00:02:13
con refactor rename
00:02:15
para que se llame
00:02:16
main pruebas
00:02:19
ya se llama
00:02:20
main pruebas
00:02:23
y ahora me voy a hacer un main
00:02:23
que será el propio main de este ejercicio
00:02:26
o al menos lo vamos a dejar
00:02:29
planteado, vale
00:02:31
pues venga
00:02:32
nos hacemos
00:02:34
mi verdadera clase main
00:02:35
con su método main
00:02:39
sí, entonces
00:02:40
dime
00:02:47
si esta clase
00:02:48
puede heredar de otra
00:02:55
esténs, pues imagínate
00:02:56
a ver, puede tener sentido
00:02:59
puede no tenerlo, pero claro que puede heredar
00:03:01
o sea, la clase main es una clase más
00:03:03
que un main herede de otra clase main
00:03:05
a ver
00:03:08
una clase
00:03:10
sí, vamos a ver, una clase main
00:03:12
es una clase normal y corriente en todos los
00:03:14
aspectos, salvo porque tiene
00:03:17
este método, es lo único que la diferencia
00:03:19
que tiene ese método
00:03:21
y ese método es un método especial
00:03:22
porque no se invoca
00:03:25
por código, sino que lo arranca la máquina
00:03:27
virtual, pero como
00:03:29
las clases main son clases normales
00:03:30
y corrientes, yo podría tener otra clase
00:03:33
main, por ejemplo,
00:03:35
¿vale?
00:03:40
Y puede heredar perfectamente.
00:03:41
Claro, hereda, pero en el momento que crece
00:03:44
el public, esta tipo de main...
00:03:46
Entonces, esta clase, claro,
00:03:48
estaría heredando todo lo que tiene
00:03:50
esta otra, en ese caso su main,
00:03:52
pero aquí tendrías un problema.
00:03:54
Y es que tienes ahora dos clases
00:03:56
con dos métodos
00:03:58
main. Entonces, la aplicación
00:04:00
ya no tiene un único punto de arranque
00:04:02
entonces
00:04:04
a la máquina virtual habría que decirle
00:04:06
cuál de las dos es el punto de arranque
00:04:08
de la aplicación
00:04:11
¿vale?
00:04:12
entonces
00:04:15
hacerlo puedes, pero la situación que generas
00:04:15
pues tienes luego que saber manejarla y gestionarla
00:04:19
entonces lo tendrías que hacer
00:04:21
con un manifest, mf
00:04:23
que es el fichero en el que dices cuál es el punto de arranque
00:04:24
de la aplicación
00:04:27
cuando hacíamos el hard veíamos que había un fichero
00:04:28
Sí, pero esa no sería la manera de hacer
00:04:30
esa situación no la harías así, en cualquier caso
00:04:43
siempre harías un main
00:04:45
y tú en función del administrador
00:04:46
efectivamente pues
00:04:49
se lo podrías pasar como parámetro
00:04:51
al main porque el main, aunque no lo hemos usado
00:04:53
hasta ahora, el main
00:04:55
es un método que en realidad
00:04:57
puede recibir parámetros
00:04:59
esos parámetros, ¿quién se los pasa?
00:05:00
la máquina virtual cuando la llama
00:05:04
como nosotros
00:05:06
estamos llamando directamente
00:05:07
a la aplicación sin más, no le está pasando nada
00:05:09
y esos parámetros están
00:05:11
a null todos
00:05:13
pero esos parámetros podemos decirle a la máquina virtual
00:05:14
cuando ejecutamos, cuando hacemos la teclita
00:05:17
verde, además de hacer la teclita
00:05:20
verde, podemos decirle
00:05:22
ahora podemos ver cómo, oye
00:05:23
no solo ejecútate, sino además
00:05:25
te voy a pasar estos parámetros
00:05:27
y esos parámetros van a rellenar automáticamente
00:05:29
este array, de tal manera que
00:05:32
el primero, vamos a hacer una prueba
00:05:34
rapidísima, tengo aquí
00:05:35
mi main pruebas, este main por ahora no tiene nada
00:05:37
hasta olvidémonos de él, vale
00:05:39
voy a hacer aquí mi main
00:05:41
de pruebas y voy a decirle
00:05:44
que antes de arrancar
00:05:46
me muestre los parámetros que ha recibido
00:05:47
vale, por ejemplo el primero
00:05:50
y el segundo, vale
00:05:53
entonces
00:06:00
esta sentencia la puedo hacer
00:06:02
entonces args0 ¿cuál es?
00:06:04
la cadena
00:06:07
que está en la primera
00:06:09
posición de este array args
00:06:11
args1 ¿quién es? la cadena
00:06:12
que está en la segunda posición
00:06:15
de este array args ¿qué tiene este array
00:06:17
args? lo que la máquina virtual le haya pasado
00:06:19
si nosotros ejecutamos
00:06:21
la aplicación como la estamos ejecutando hasta ahora
00:06:23
que es ejecuta y me callo
00:06:25
no digo una palabra más, ahí no hay nada
00:06:27
de hecho vamos a ejecutar este
00:06:29
main pruebas
00:06:31
bueno, claro
00:06:31
lo primero que me dice es esto
00:06:38
porque no hay arc 0
00:06:40
no tiene nada, entonces es null
00:06:42
me ha salido una excepción
00:06:44
porque
00:06:48
aquí no le he pasado nada
00:06:49
yo he llamado a la máquina virtual
00:06:54
y luego no le he dicho
00:06:56
oye y además recibe parámetros
00:06:57
con lo cual efectivamente
00:06:59
en lugar de no salir de excepción
00:07:00
voy a decir
00:07:03
Que me muestre la longitud de ese array
00:07:05
La longitud de ese array
00:07:07
Ah, me va a dar error
00:07:09
No, la longitud de ese array no
00:07:10
Porque me va a dar cero
00:07:12
Pues si es nulo o no es nulo
00:07:13
Por ejemplo esto
00:07:16
Vamos a hacer esto
00:07:18
Pasado parámetros
00:07:20
Y él sé que los muestre
00:07:33
Que los muestre recorriendo el array
00:07:37
Para cada string
00:07:40
Aquí
00:07:43
arts, pues que lo muestre
00:07:45
vale, pues lo primero
00:07:47
que hace este programa cuando lo arranquemos es
00:07:53
ver si la máquina virtual le ha dado
00:07:55
alguna colección de parámetros
00:07:57
si no le ha dado ninguna colección de parámetros
00:07:59
me dirá, no has pasado parámetros
00:08:01
y si sí que se la ha dado, la recorrerá
00:08:03
para mostrar cada parámetro
00:08:05
vale, y luego ya sigue
00:08:07
entonces si ejecutamos esto
00:08:09
pues
00:08:10
como es que me debería decir
00:08:12
no has
00:08:16
Ah, bueno, es que igual en lugar de null
00:08:17
Lo que me hace es crear uno de posición 0
00:08:20
Si args es igual
00:08:21
Si args es igual a null
00:08:23
O args.len
00:08:25
Es
00:08:29
Igual a 0
00:08:32
Es decir, si me has pasado un parámetro null o 1
00:08:33
Con ninguna
00:08:36
Posición
00:08:38
Ahora ya sí que, bueno, vamos a
00:08:39
Pararlo
00:08:42
Antes que nada
00:08:43
Lo volvemos a ejecutar
00:08:45
Vale
00:08:48
no has pasado parámetros
00:08:49
y luego ya el programa arranca
00:08:51
vale, bueno, pues resulta que
00:08:52
además viene bien porque esto en algún momento
00:08:54
teníamos que contar, que arrancamos esto
00:08:56
todo el rato, lo arrastramos y no sabemos
00:08:58
lo que significa, vale, pues entonces podemos
00:09:00
ahora arrancar un programa y además
00:09:02
el momento de arrancarlo
00:09:05
pasarle unos cuantos parámetros, que son cadenas
00:09:06
de texto, las que me den la gana
00:09:09
entonces, eso, si lo hacemos
00:09:10
desde consola
00:09:13
cuando arrancamos nuestra aplicación desde consola
00:09:14
recordad que lo hacíamos
00:09:17
siempre así
00:09:18
java y luego poníamos el nombre
00:09:20
de la clase a ejecutar
00:09:23
podríamos pasárselo así
00:09:25
los parámetros
00:09:27
java, el nombre de la clase
00:09:28
a ejecutar, el programa que fuera
00:09:31
y luego le podemos pasar aquí ya los parámetros
00:09:33
lo que a mi me dé la gana
00:09:35
entonces aquí estaría ejecutando
00:09:37
este código y además
00:09:41
pasándole parámetros
00:09:43
como nosotros no estamos ejecutando desde consola
00:09:44
sino desde el eclipse
00:09:47
el eclipse tiene que tener una manera
00:09:49
de indicar, oye
00:09:51
cuando tú le das al verde
00:09:53
quieres ejecutarlo
00:09:54
solamente o además quieres pasar
00:09:57
parámetros, eso se
00:09:59
configura en el entorno de configuración
00:10:01
en configuraciones de ejecución
00:10:03
lo que aparece aquí
00:10:05
venga, pues entonces
00:10:06
¿veis? y aquí me aparece
00:10:09
una pestañita que dice argumentos
00:10:11
¿veis que hay una
00:10:13
pestaña que dice argumentos?
00:10:15
o sea, aquí a mí me aparece main
00:10:16
que me dice, ¿qué clase quieres ejecutar? main pruebas
00:10:18
vale, estupendo
00:10:21
¿qué argumentos quieres pasar?
00:10:22
pues ahora mismo no tenemos pasando argumentos
00:10:25
vamos a pasarle
00:10:26
hola, ¿qué tal?
00:10:27
creo que hay que pasárselos ahí separados por espacio
00:10:30
creo, vale
00:10:32
y apply
00:10:34
vale, y ahora ya vamos a ejecutarlo
00:10:36
¿veis? entonces
00:10:41
él ahora ya, además de ejecutar
00:10:45
la máquina virtual
00:10:47
ha recibido los parámetros que le he pasado
00:10:50
porque están aquí en la
00:10:53
pestañita de parámetros
00:10:55
y esos parámetros
00:10:57
han ido a parar
00:10:59
a este array
00:11:01
¿vale?
00:11:05
entonces, situación que me decías tú
00:11:06
pues que una aplicación arranque de una manera
00:11:08
u otra en función de que usó el arranque
00:11:11
la forma de programar eso
00:11:13
nunca la haríamos con
00:11:15
diferentes main
00:11:17
o con diferentes métodos main, no
00:11:18
una aplicación de escritorio siempre tiene que tener
00:11:21
un único método main
00:11:23
y ahora ya que ese método main distinga
00:11:24
que tiene que hacer para irse por un método
00:11:27
o por otro y ya está, entonces la forma de distinguir
00:11:29
si has entrado como perfil
00:11:32
de usuario, como perfil de lo que sea
00:11:33
pues puede ser a partir de aquí
00:11:35
por ejemplo, puede ser a partir de aquí
00:11:36
y entonces este distinguiría
00:11:39
el parámetro que me has pasado es parámetro del perfil
00:11:40
de usuario, parámetro del perfil
00:11:43
de administrador, pues yo ya tiro por un lado o por otro
00:11:45
sería una opción, otra
00:11:47
que el main lo primero que hiciera
00:11:48
fuera pedirte
00:11:51
tu login y conectarse a la sede de datos
00:11:53
para ver cuál es tu perfil. Mil formas
00:11:55
diferentes para distinguir cuál es tu perfil y a partir
00:11:57
de ahí irse por un camino o por otro. Pero siempre
00:11:59
un main. ¿Vale? Siempre un main
00:12:01
en la aplicación. ¿Vale?
00:12:03
Pero, aparte, dicho esto,
00:12:05
una clase main, como es una clase
00:12:08
como otra cualquiera, salvo que tiene
00:12:09
ese método main, que debe ser único,
00:12:11
puede heredar de quien quiera.
00:12:13
Y si hereda, pues recibe todo lo que tiene.
00:12:15
Claro.
00:12:18
pero hacer que una clase
00:12:18
en main que tiene un método main
00:12:21
herede de otra que también tiene método main
00:12:23
todo eso
00:12:24
no vas a ganar nada, nada más que hacer
00:12:26
un lío que vete a saber por dónde sale
00:12:29
¿vale?
00:12:31
bueno, pues todo, ahora este era
00:12:33
nuestro main del ejercicio
00:12:35
y ahora este main
00:12:38
va a trabajar para una empresa
00:12:40
esta es una aplicación, ahora ya para una empresa
00:12:44
luego, los datos
00:12:45
de esta aplicación van a ser la empresa
00:12:47
con la que está trabajando
00:12:49
pues esta empresa, esta única empresa
00:12:50
bueno, no he puesto ni el método
00:12:53
aquí
00:12:57
vale, pues
00:12:58
estos son los datos, los datos es la empresa
00:13:10
en la que estoy y se acabó
00:13:12
como tenía un constructor solo con el nombre
00:13:13
pues ya está
00:13:19
vale, y ahora esta empresa
00:13:21
ya está creada
00:13:27
esta empresa no tiene departamentos
00:13:28
todavía
00:13:31
y ya está
00:13:31
y ahora ya a través de la aplicación de gestión del menú
00:13:34
ya hago las cosas que tenga que hacer.
00:13:38
Entonces, ¿qué funcionalidades?
00:13:40
Dice, bueno, aquí dice con cuatro departamentos sin empleados.
00:13:43
Venga, vamos a hacer este main tal cual para este ejercicio.
00:13:46
Vamos a hacerlo porque tendría quizá más utilidad
00:13:49
que en el menú hubiera una opción que fuera agregar un departamento.
00:13:51
Pero bueno, vamos a hacer lo que nos dice,
00:13:56
que es vamos a crear la empresa con cuatro departamentos.
00:13:58
bueno pues entonces
00:14:02
la empresa
00:14:04
sus departamentos van a estar en este
00:14:05
array, entonces esto lo podemos hacer de mil maneras
00:14:08
que es
00:14:10
crear directamente en el main
00:14:12
un array de cuatro departamentos sin empleados
00:14:14
y meter el array
00:14:16
y ya está, podemos hacer eso y se acabó
00:14:17
y ahora vamos a crear
00:14:19
los departamentos
00:14:40
departamento
00:14:42
ojo, esto
00:14:44
un for each que era mi tentación por la costumbre
00:14:46
sí que aquí ya sí que jamás
00:14:48
porque ahora vamos a recorrer este array
00:14:51
para ahora ya sí crear
00:14:53
un objeto nuevo, departamento para
00:14:55
cada posición, luego al crear un objeto
00:14:57
creo una dirección de memoria nueva
00:14:59
si lo hago a través del for each
00:15:01
esa dirección de memoria iría a la copia
00:15:03
no iría a la verdadera posición del array
00:15:05
luego no me serviría de nada
00:15:07
luego aquí sí que un for each
00:15:08
no tendría error de sintaxis
00:15:11
pero no te crearía nada en el array
00:15:13
crearía objetos que luego desaparecerían
00:15:15
Claro, tiene que ser un for normal, sí o sí.
00:15:17
¿Pero el for each no sirve?
00:15:24
No, porque si yo hago esto con un for each,
00:15:27
para cada departamento de mi array de departamentos.
00:15:31
¿Vale? ¿Qué vamos a hacer?
00:15:37
Vamos a crear un departamento.
00:15:38
New departamento.
00:15:41
¿Qué propiedades necesita el departamento?
00:15:46
Vamos a ponerle sin empleados por ahora, solamente con el nombre.
00:15:48
Pues venga
00:15:51
D.set
00:15:53
Nombre
00:15:54
Y que lo vaya pidiendo
00:15:56
Por teclado
00:15:59
Vale, entonces este array teóricamente
00:16:01
Cuatro veces
00:16:03
Porque este array tiene cuatro posiciones
00:16:05
Me instancia un objeto departamento
00:16:07
Y le pone como nombre una cadena
00:16:09
Que me ha pedido, y así cuatro veces
00:16:11
Vale
00:16:13
Nos creemos que el array ya está construido
00:16:14
Con departamentos dentro de él
00:16:18
Vamos a recorrerlo, a ver
00:16:19
vamos a recorrerlo para mostrar
00:16:20
los nombres de los departamentos
00:16:22
que acabamos de crear
00:16:24
para cada departamento en este array
00:16:25
que aparentemente he creído
00:16:29
rellenar
00:16:30
vamos a mostrar
00:16:33
de punto
00:16:35
getNombre
00:16:37
vale, pues ejecutamos este main
00:16:38
vale, y me va pidiendo
00:16:41
los nombres de los cuatro departamentos
00:16:48
departamento 1, departamento 2
00:16:49
departamento 3
00:16:52
departamento 4
00:16:53
y me sale un null pointer exception
00:16:55
claro, es justo lo que os estaba diciendo
00:16:57
¿por qué me sale un null pointer exception?
00:17:00
esto que ya se os quede
00:17:03
grabado en la cabeza
00:17:04
para siempre
00:17:06
porque yo aquí
00:17:08
en la instancia de un nuevo objeto de departamento
00:17:10
¿qué estamos haciendo?
00:17:12
aparece un nuevo objeto en memoria
00:17:13
con una dirección que se acaba de reservar
00:17:15
una dirección que aparece en una
00:17:16
esa dirección se la asignamos
00:17:17
a este objeto de
00:17:20
y este objeto D
00:17:22
es una copia
00:17:24
de la dirección que tiene
00:17:26
el array, no es la propia
00:17:29
posición del array
00:17:31
entonces el objeto lo dejo apuntado
00:17:32
por D que es una copia, no lo dejo
00:17:34
apuntado por la posición del array
00:17:36
entonces el array no se ha enterado de nada
00:17:38
estoy creando todo el rato variables D
00:17:40
que apunta a un nuevo departamento, otra variable D
00:17:42
otra variable D y otra variable D
00:17:44
y ya está
00:17:46
entonces el array no se ha enterado
00:17:47
si yo simplemente quiero consultar
00:17:49
sí, porque me da igual
00:17:53
consultar en la propia posición del array
00:17:55
que en una copia de esa
00:17:57
porque ambas son direcciones que me llevan al mismo sitio
00:17:59
pero si estoy cambiando la dirección
00:18:01
a donde apunta, no la puedo cambiar
00:18:05
ahí, la tengo que cambiar aquí
00:18:07
bueno, pues entonces, esto con un
00:18:09
for each, por tanto, nunca lo podríamos hacer
00:18:13
lo tendríamos que hacer
00:18:15
y ahora esto sería
00:18:16
de 2di
00:18:26
Igual al new departamento
00:18:29
Esto ya sí, si ejecutamos esto
00:18:31
Me van a salir ya los nombres perfectamente
00:18:36
De uno
00:18:38
De dos, de tres
00:18:41
De cuatro
00:18:43
Ya están, de uno, de dos, de tres, de cuatro
00:18:44
Vale
00:18:46
Bueno, entonces ya tenemos
00:18:51
El array de cuatro departamentos creado
00:18:54
Vamos a ponérselo a la empresa
00:18:56
Como su array de departamentos
00:18:58
Bueno, pues ya está, la empresa para eso
00:18:59
La empresa que acabamos de crear
00:19:01
Tiene su método set
00:19:04
a la que yo le doy un array
00:19:05
y lo pone como
00:19:08
valor para esa propiedad array, pues ya está
00:19:09
la empresa ya tiene entonces
00:19:12
su nombre, que se lo he dado en el
00:19:13
constructor, y su
00:19:16
array de departamentos, los cuatro que
00:19:18
acabo de crear
00:19:20
ya tendría empresa, sus dos
00:19:21
propiedades, las únicas que necesita
00:19:24
y ahora ya, pues
00:19:25
me dice el main, venga, pues
00:19:30
¿qué funcionalidades queremos para esa empresa
00:19:31
que tiene cuatro departamentos
00:19:34
por ahora sin empleados
00:19:36
porque del departamento solamente le hemos puesto el nombre
00:19:38
cada departamento a su vez
00:19:40
tiene una raíz de empleados que está a cero
00:19:42
vale
00:19:44
pero es que para eso ya está
00:19:45
las opciones del menú
00:19:48
incorporar un empleado
00:19:50
a un departamento
00:19:52
vale, pidiendo para ello
00:19:53
nombre del departamento al que los vas a incorporar
00:19:56
y datos del empleado
00:19:58
si es gerente o temporal, metelo en ese departamento
00:20:00
mostrar
00:20:02
la salida total de la empresa
00:20:04
y mostrar departamento
00:20:05
que más salario paga.
00:20:08
Pues hacéis esas tres
00:20:10
funcionalidades.
00:20:12
¿Ahora? No.
00:20:14
Ahora no.
00:20:19
En casa.
00:20:20
Vale, a ver.
00:20:22
Pues eso,
00:20:25
nuestro main ahora sería esto.
00:20:26
Una opción,
00:20:30
y ahora ya todo el rato, el do
00:20:31
incorporar
00:20:33
empleado
00:20:44
a departamento
00:20:45
dado nombre
00:20:54
departamento
00:20:57
y solicitando datos del empleado.
00:21:00
Estoy poniendo la opción larguísima para que quede claro.
00:21:03
Datos del empleado también, si es gerente, temporal, etc.
00:21:15
En realidad es lo mismo que esto.
00:21:19
Ya lo hemos hecho en este main de aquí.
00:21:22
Agregar empleado. Lo que pasa es que en este
00:21:23
el empleado lo agregábamos al único departamento que teníamos.
00:21:25
al único, o sea es utilizar esto
00:21:29
pero en lugar de agregarlo al único departamento que teníamos en el otro main
00:21:33
que solo teníamos uno, que era este, solo uno
00:21:37
pues tenemos que una vez que tenemos el empleado ya leído por teclado
00:21:40
que ya lo tenemos aquí ya leído por teclado este empleado
00:21:45
tendremos que recorrer todos los departamentos de la empresa para ver
00:21:48
cuál es el que se llama como me han pedido y agregárselo a ese
00:21:53
O sea, será, cambiará respecto a esta versión del main de pruebas el meter esto en un for, el único que cambiará, meter eso en un for para agregarse al departamento que toque, ya está, meter eso en un for y listo, tendremos la opción 2, que será mostrar salario total de la empresa, que será lo mismo meter en un for el salario total de cada departamento,
00:21:57
pues mostrar salario total de la empresa
00:22:33
pues mostrar salario
00:22:36
de empresa
00:22:42
será en nuestro main de pruebas
00:22:43
mostrábamos el salario del único
00:22:46
departamento que teníamos, que era esto
00:22:48
pues lo único que cambiará
00:22:50
será meter esto en un for
00:22:53
para que haga la suma acumulativa de todos
00:22:54
ni siquiera, porque ya hay un método
00:22:56
en la clase empresa
00:22:58
ya hay un método en la clase empresa que hemos hecho
00:22:59
para mostrar el sueldo total
00:23:02
de la empresa
00:23:04
y hay un método en la clase empresa
00:23:06
que muestra todo lo que paga la empresa
00:23:08
pues esta opción 2
00:23:10
será llamar ese método para este objeto
00:23:12
esta opción 2 es una línea
00:23:14
es para mi empresa llamar al método
00:23:15
sueldo total y se acabó
00:23:18
esa será la opción 2
00:23:20
y la opción 3 de nuevo es recordar
00:23:21
la programación, recordarla
00:23:25
hacer máximos, mínimos, etc
00:23:27
recordarlo
00:23:28
mostrando el departamento que más se gasta
00:23:31
pues tendréis que hacer un máximo
00:23:33
dentro de todo el array
00:23:35
de departamentos
00:23:37
de mi empresa, ver
00:23:40
el departamento que más paga, etcétera
00:23:41
y esto de aquí, estas tres funciones
00:23:47
son, ya esto ni es herencia
00:23:53
ni es nada, es lo de siempre
00:23:54
lo de siempre una y otra vez
00:23:56
y aquí pues como siempre
00:23:58
le demos la opción
00:24:03
y ahora ya pues lo de siempre
00:24:04
en el caso
00:24:11
de que sea uno, pues lo que haya que hacer
00:24:22
que es un copia y pega de nuestro main de pruebas
00:24:23
pero añadiendo un bucle
00:24:27
en el caso 2
00:24:28
una línea
00:24:31
una línea, es el caso 2
00:24:32
y el caso 3, pues hacer un máximo
00:24:35
dentro de la raíz de departamentos
00:24:39
y aquí acabaría
00:24:43
mi switch
00:24:47
y aquí acaba
00:24:48
aquí acaba el switch
00:24:50
y el doom
00:24:53
esta me sobra
00:24:57
Y aquí es el while
00:25:00
Opción
00:25:02
Diferente de la de salir, sea la que sea
00:25:04
La 0 por ejemplo
00:25:07
Bueno, pues esto
00:25:09
Otra cosa que hacéis en casa
00:25:24
Completar este main
00:25:26
Que es nada
00:25:27
Esto es hacer un máximo
00:25:29
Que son 4 o 5 líneas
00:25:32
Si se sabe hacer un máximo
00:25:33
Si
00:25:37
Porque en casa hay que vencer la pereza
00:25:42
Y hacer cosas
00:25:45
¿Vale?
00:25:46
Ya me encargaré personalmente
00:25:48
De que no apruebe nadie
00:25:50
Solamente por venir a clase
00:25:53
Vale, a ver
00:25:55
Figura geométrica
00:25:58
Este ejercicio que nos va a permitir ya
00:25:59
Introducir las clases abstractas
00:26:05
Venga
00:26:07
Ejercicio
00:26:08
Lo voy a meter
00:26:14
En un paquete
00:26:23
Que ponga ejercicio
00:26:24
Figuras
00:26:27
Porque son un montón de clases
00:26:29
Una clase por cada figura, entonces cada ejercicio lo estaba metiendo en un paquete
00:26:33
que a su vez todos en un mismo proyecto para subirlo así a la aula virtual.
00:26:37
Lo que digo una y otra vez, pues eso, otra vez.
00:26:41
Que efectivamente me repito muchísimo porque...
00:26:46
Venga, pues vamos a hacer este.
00:26:50
Se supone que esta es una aplicación para hacer funcionalidades
00:27:06
con figuras geométricas.
00:27:11
en este caso
00:27:14
perímetros y áreas
00:27:17
lo típico
00:27:18
vale, una aplicación que me permita de forma
00:27:20
rápida calcular perímetros y áreas
00:27:23
de
00:27:26
diferentes figuras
00:27:27
bueno, en particular
00:27:28
ahora mismo va a trabajar
00:27:32
con triángulos cuadrados y círculos
00:27:35
vale
00:27:37
entonces yo podría hacer la aplicación
00:27:38
sin herencia
00:27:41
haciendo una clase triángulo, una clase cuadrado y una clase círculo
00:27:46
o haciendo, viendo que todas son figuras geométricas
00:27:51
pues decir, oye, voy a meter una arquitectura de herencia
00:27:56
voy a hacer una superclase figura geométrica
00:27:59
y que todas se hereden de ella
00:28:03
porque así a lo mejor, a lo largo del desarrollo
00:28:04
puedo ver que incluyendo cosas en la superclase
00:28:08
se me facilitan las cosas
00:28:12
¿Vale? Pues entonces
00:28:15
Una vez que hemos identificado
00:28:17
Que tiene sentido hacer un modelo de herencia
00:28:20
En el cual haya una superclase figura geométrica
00:28:22
Y las subclases que ahí me den la gana
00:28:24
Pues vamos a hacer
00:28:26
Esa superclase
00:28:28
Pues es lo primero que hacemos
00:28:30
La superclase
00:28:35
Figura
00:28:36
Geométrica
00:28:41
Geométrica
00:28:44
Vale, aquí ya como el diseño me lo han hecho
00:28:45
No tenemos que pensar mucho, pero me dicen
00:28:53
todas las figuras van a tener un nombre
00:28:55
pues entonces
00:28:58
como todas van a tener un nombre
00:28:59
esa propiedad nombre
00:29:01
la puedo poner en la superclase
00:29:02
porque todas, me da igual que sean
00:29:06
triángulos, cuadrados, círculos
00:29:07
trapezoides, polígonos
00:29:09
pentágonos, todas van a tener
00:29:11
un nombre, pues entonces esa propiedad
00:29:14
la pongo en la superclase
00:29:16
vale, y además
00:29:17
como parece ser que ya después de
00:29:29
haber analizado cosas del futuro
00:29:32
de esta aplicación, alguien ha debido ver que saber
00:29:33
los lados que tiene esa figura es interesante
00:29:37
pues dice, vamos a hacer una propiedad específicamente para guardar el número de lados que tenga
00:29:40
5, 7, 8, entonces como todas las figuras geométricas
00:29:45
tienen lados, el círculo no
00:29:49
con lo cual esta se queda un poco fea, pero bueno
00:29:55
el que hizo el diseño nos ha dicho que pongamos una propiedad número de lados en figura
00:29:58
geométrica, no sé que se entiende por
00:30:03
el número de lados en círculo, pero bueno, vale, venga, pues un constructor
00:30:07
que inicialice los atributos, get y set y tirando, vale
00:30:18
ahora ya sí vamos a ver que figuras geométricas vamos a trabajar
00:30:46
en esta aplicación, pues nos dice, vamos a trabajar
00:30:50
con triángulo, con cuadrado
00:30:55
y con círculo
00:30:59
triángulo se caracteriza por los tres lados que tiene
00:31:02
cuadrado solo por uno porque el cuadrado
00:31:06
todos sus lados son iguales, luego con poner la medida de uno solo
00:31:10
tengo la medida de los tres, a diferencia del triángulo que sus lados pueden ser distintos
00:31:15
entonces tengo que poner las tres medidas y círculo
00:31:19
con tener el radio ya lo tengo completamente caracterizado
00:31:22
pues venga, hacemos las tres subclases
00:31:25
Triángulo
00:31:28
Que herede de
00:31:42
Figura geométrica
00:31:48
Vale
00:31:52
Vamos a hacerle su constructor
00:31:54
Bueno, vamos a añadir primero
00:31:58
Sus tres propiedades específicas
00:31:59
Que son las tres longitudes
00:32:03
De sus tres lados
00:32:10
Y ahora ya un constructor
00:32:11
Porque el constructor ya no nos vale
00:32:17
Vale, entonces al constructor
00:32:19
Le paso todas las cinco cosas
00:32:37
nombre, num, lados, lado 1, lado 2, lado 3
00:32:39
llamo al constructor de la clase padre
00:32:41
el constructor llamando al super lo podéis generar automáticamente
00:32:45
con generar constructor y os acordáis de aquí arriba
00:32:50
seleccionar la super clase
00:32:54
seleccionáis la super clase
00:32:56
y ya te genera él, la llamada, el constructor de la super clase
00:33:01
Con super, etc
00:33:06
Vale, y luego get y set de las tres cosas que nos faltan
00:33:07
Vale, ya tenemos el triángulo
00:33:12
Pues lo mismo con el cuadrado
00:33:20
Cuadrado solo añade una propiedad propia
00:33:22
Que es la longitud del lado
00:33:36
Como todos tienen la misma longitud
00:33:38
Pues solo añade una propiedad propia
00:33:40
Entonces, ponemos el constructor
00:33:43
Ahí se me olvidó poner el extens
00:33:47
El extens de figura geométrica
00:33:50
y ahora ya si genero el constructor
00:33:53
vale, y el getty set de la única propiedad que he añadido
00:34:04
tenemos el cuadrado con sus particularidades
00:34:22
y nos quedaría el círculo
00:34:37
bueno, pues el círculo
00:34:39
también hereda de figura geométrica y este añade
00:34:49
el radio, estoy haciendo todo en int
00:35:01
tendré que hacer el constructor específico
00:35:05
para él porque los heredados
00:35:10
no le valen
00:35:11
hago el constructor apoyándome en el de arriba
00:35:12
y el get y set para el nuevo
00:35:18
¡Hala! pues ya tenemos
00:35:20
tres subclases de la superclase
00:35:34
todas ellas tienen
00:35:36
un nombre y un número de lados
00:35:38
sus get, set y todo eso
00:35:40
y luego cada una de ellas tiene algo propio
00:35:42
bueno
00:35:44
vale, luego aquí la aplicación
00:35:45
ahora sigue
00:35:47
haciendo la clase manejador de figuras
00:35:52
manejador de cuadros, manejador de círculos
00:35:53
que ahora hacemos
00:35:55
¿vale?
00:35:57
pero, primera cosa que
00:35:58
vamos a pensar
00:36:00
entonces, se supone que
00:36:02
esta aplicación es para
00:36:05
calcular perímetros
00:36:07
y áreas de
00:36:09
figuras geométricas
00:36:11
como triángulo, cuadrado y círculo
00:36:12
y todas las que yo quiera incorporar
00:36:15
vale, pero esas cosas
00:36:17
que va a calcular como
00:36:19
perímetros y áreas
00:36:21
solo tiene sentido calcularlas
00:36:22
sobre objetos, sobre figuras ya concretas
00:36:25
como un triángulo, un cuadrado, un círculo
00:36:29
es decir, figura geométrica es una superclase
00:36:31
pero que no es nada en realidad
00:36:34
una figura geométrica es un concepto
00:36:36
pero no se puede concretar
00:36:39
un triángulo si es así, tiene su perímetro, su área
00:36:41
un círculo es así, tiene su perímetro, su área
00:36:44
una figura geométrica es un concepto
00:36:47
de alguna manera abstracto
00:36:49
No se puede concretar.
00:36:51
Luego, esta clase de aquí,
00:36:53
esta clase de aquí es una clase de la cual,
00:36:59
en principio ya prevemos que nunca vamos a instanciar objetos.
00:37:02
No vamos a instanciar una figura geométrica,
00:37:05
porque en mi aplicación no van a existir figuras geométricas.
00:37:08
En mi aplicación van a existir círculos, cuadrados, triángulos,
00:37:11
que son con los que trabajo.
00:37:15
No van a existir figuras.
00:37:17
En la aplicación anterior que hemos hecho,
00:37:18
teníamos empleado
00:37:20
de los cuales heredaban empleado
00:37:22
temporal y gerente
00:37:24
pero podíamos tener de los tres tipos
00:37:26
podía haber objetos empleado
00:37:28
podían existir
00:37:30
existir empleados temporales y gerentes
00:37:31
pero esta es una situación un poco distinta
00:37:34
ya vemos que es distinta
00:37:36
de la superclase
00:37:37
la superclase es como una especie de conceptos
00:37:39
una especie de plantilla que tiene lo básico
00:37:41
pero de la superclase no van a existir objetos
00:37:44
porque no existen
00:37:46
figuras geométricas abstractas
00:37:47
No existen en la realidad, no puedo ver una figura geométrica,
00:37:50
puedo ver un triángulo, un cuadrado, una figura geométrica,
00:37:53
necesito concretarla, necesito concretarla un poco más,
00:37:55
no puedo verla, ¿vale?
00:37:58
Vale, de hecho, por ejemplo,
00:38:00
todas las figuras estas de aquí,
00:38:03
triángulo, cuadrado, círculo,
00:38:05
se va a poder obtener de ellas el perímetro, por ejemplo, ¿no?
00:38:08
Entonces, imaginaos que queremos hacer
00:38:11
un método perímetro
00:38:14
para obtener los perímetros de estas figuras.
00:38:16
entonces en triángulo
00:38:19
necesitaríamos que hubiera un método perímetro
00:38:21
en cuadrado necesitaríamos
00:38:22
que hubiera un método perímetro
00:38:25
y en círculo otro
00:38:26
porque el perímetro de triángulo
00:38:27
el de cuadrado y el de círculo se hacen de forma distinta
00:38:30
vale
00:38:33
entonces en las tres debería haber un método
00:38:34
perímetro
00:38:37
vale por ejemplo en la clase
00:38:37
triángulo si
00:38:40
nos
00:38:44
hacemos un
00:38:47
método
00:38:48
perímetro para nuestra clase triángulo, pues ya sabemos
00:38:50
que esta clase triángulo me devolvería como perímetro
00:38:55
esto, lado 1 más lado 2 más
00:38:59
lado 3, ¿vale? Sería esto simplemente, el método
00:39:03
perímetro de la clase triángulo sería este, ¿verdad? Me devuelves
00:39:07
la suma de los tres. El método perímetro de
00:39:13
cuadrado, pues sería
00:39:17
parecido, me devolvería
00:39:21
lado
00:39:24
multiplicado por 4
00:39:25
eso es lo que me devolvería, el método
00:39:27
perímetro de cuadrado
00:39:29
lado por 4
00:39:31
y el método perímetro de círculo
00:39:33
¿qué nos devolvería?
00:39:41
pues 2
00:39:46
por pi
00:39:47
por
00:39:49
el radio
00:39:53
¿vale? me sale en rojito
00:39:55
¿por qué?
00:40:10
¿por qué me sale en rojo?
00:40:12
Por el pi, ¿qué más?
00:40:16
Pero más, concreta más.
00:40:18
La posibilidad que crea el número de decimales.
00:40:20
Claro, porque pi es decimal.
00:40:22
Entonces, cuando hacemos una operación entre decimales y enteros,
00:40:25
se hace la promoción del entero al decimal,
00:40:29
con lo cual el total se convierte en decimal.
00:40:32
Luego este total se ha convertido en decimal,
00:40:35
pero a mí me han dicho un entero.
00:40:38
Pues no, casa.
00:40:40
Bueno, pues si tiene que ser entero,
00:40:40
porque tiene que ser entero, como yo estoy trabajando,
00:40:42
pues no pasa nada.
00:40:45
le hago un casting que me quita la parte decimal
00:40:46
y apañado
00:40:48
le hago un casting a todo
00:40:50
le quito la parte decimal
00:40:53
vale, pues entonces
00:40:56
está claro que el método
00:40:58
perímetro en cada clase tiene que ser distinto
00:41:00
pero ahora
00:41:02
entonces yo ya
00:41:04
estoy perdiendo un poco las ventajas
00:41:06
de la herencia
00:41:08
he ganado la de no tener que escribir aquí
00:41:08
nombre cada vez
00:41:12
al hacer el instance, lo he ganado
00:41:13
pero cuál era la verdadera y la importante
00:41:15
que si yo quiero trabajar con muchas figuras geométricas
00:41:18
pues las meto todas en una raíz
00:41:21
y luego cada una de ellas puede ser
00:41:22
círculo, cuadrado, me da igual porque todas serían de la misma
00:41:24
pero claro
00:41:26
como el método perímetro
00:41:28
no está aquí
00:41:30
porque la figura geométrica no tiene perímetro
00:41:31
depende, depende de si es triángulo
00:41:34
cuadrado, círculo, como no está aquí
00:41:36
si ahora yo tuviera
00:41:38
vamos a hacernos nuestro
00:41:41
main de pruebas
00:41:43
Para ver
00:41:44
Main de pruebas aquí en el paquete
00:41:45
Siempre se me olvida esto
00:41:52
Vale
00:41:54
Imaginaos que yo ahora voy a trabajar
00:42:04
Con un montón de figuras geométricas
00:42:07
Con lo cual lo meto en un array
00:42:09
Aquí voy a meter todas mis figuras
00:42:12
Por ejemplo
00:42:25
Supongo que metemos dos
00:42:30
Dos figuritas
00:42:31
En la primera posición
00:42:35
Voy a poner
00:42:38
En figuras de 0 voy a meter un círculo
00:42:41
Que se llama mi círculo
00:42:45
Número de lado 0 porque es un círculo
00:42:57
Y radio 4
00:43:01
Y ahora en figuras de 1 voy a meter pues un cuadrado
00:43:02
Por ejemplo
00:43:08
Mi cuadrado, número de lados, pues 4
00:43:09
Y lado del cuadrado, venga, que sea 6
00:43:24
bueno, pues entonces
00:43:29
aquí tengo un main concreto
00:43:36
particular, un main concreto que tiene
00:43:39
dos figuras
00:43:41
entonces las he metido las dos en mi array de figuras
00:43:42
y ahora yo ya puedo trabajar con ese array
00:43:45
en conjunto, pero claro, si yo quiero
00:43:47
mostrar los perímetros, pues ya sabemos
00:43:49
ya avanzamos
00:43:51
lo que nos va a pasar
00:43:53
en el figura de abajo
00:43:54
en la posición debería
00:43:57
poner un nombre
00:43:59
ay, perdón, sí, sí, sí, en la posición
00:44:00
es que he hecho copia y pega, sí
00:44:02
vale, pues si yo ahora recorro
00:44:04
cada una de mis figuras geométricas
00:44:08
que están en mi array
00:44:11
para calcular el peri
00:44:12
para que me muestre el perímetro de todas ellas
00:44:15
pues efectivamente
00:44:17
tengo el problema que ya prevemos
00:44:19
que no tengo el método
00:44:20
perímetro, vale, no lo tengo
00:44:23
entonces
00:44:29
lo de la herencia ha sido imprescindible
00:44:31
porque si yo no puedo meter todas las figuras
00:44:33
en un solo array
00:44:35
y aquí tengo dos, pero si tengo tres mil
00:44:36
pues no voy a trabajar con
00:44:39
3000 referencias distintas
00:44:42
tienen que ir todas a un array
00:44:44
pero que ocurre
00:44:45
que yo en la clase figura geométrica
00:44:47
no he metido la propiedad
00:44:50
perímetro porque aquí no tiene sentido
00:44:52
porque la figura geométrica
00:44:54
no tiene una forma de definir
00:44:56
su perímetro
00:44:58
depende de que tipo sea
00:44:59
entonces el momento de definirlo es aquí abajo
00:45:01
vale
00:45:03
pero claro el compilador ya sabemos
00:45:05
por enesísima vez
00:45:07
ya sabemos que el compilador dice
00:45:09
¿de qué clase es esta referencia?
00:45:12
figura geométrica, voy a verificar que en figura
00:45:13
geométrica hay un método
00:45:16
perímetro, uy no lo hay, pues no te dejo seguir
00:45:17
vale, entonces en figura
00:45:20
geométrica debería haber un metro perímetro
00:45:22
porque si no, no hacemos nada
00:45:24
entonces en figura geométrica hay que hacer
00:45:25
un método perímetro
00:45:29
perímetro
00:45:30
y
00:45:36
vacío
00:45:39
vacío no lo puedo dejar
00:45:41
porque tiene que devolver un int
00:45:43
pues al menos tiene que hacer un retun
00:45:46
porque devuelve int
00:45:48
luego un retun al menos tiene que tener
00:45:49
entonces
00:45:52
vale, si yo lo dejo así
00:45:54
esto ya funciona y casa
00:45:55
porque ahora ya, ya sabemos
00:45:57
que la máquina virtual no es el compilador
00:45:59
entonces la máquina virtual
00:46:02
cuando vea esto
00:46:04
va a decir, oye FG
00:46:06
¿cómo te instanciaste?
00:46:07
como círculo, pues llamo al perímetro
00:46:09
de círculo, que es el
00:46:11
bueno, oye tú
00:46:13
FG, ¿cómo te instanciaste? como cuadrado
00:46:15
pues llamo al perímetro de cuadrado
00:46:17
que es el bueno, es decir, a este no le va a llamar
00:46:19
nadie
00:46:21
no le va a llamar, pero lo hemos tenido
00:46:23
que hacer, porque si no el compilador se calla
00:46:25
pero, esta solución
00:46:27
tampoco nos gusta, porque estamos metiendo ahí
00:46:30
un retún cero
00:46:33
que es que el mensaje que transmites
00:46:34
oye, todas las figuras del mundo
00:46:37
su perímetro es 0
00:46:38
porque algo hemos tenido que poner
00:46:40
como si pongo esto, algo he tenido que poner
00:46:41
para que se calle, entonces eso ya es feo
00:46:44
la idea que transmite
00:46:47
y de hecho puede tener efectos
00:46:48
secundarios peligrosos
00:46:50
porque tú haces de repente
00:46:53
ahora un pentágono
00:46:55
y se te olvida sobre escribir
00:46:56
la clase perímetro, se te olvida
00:46:59
cuando ahora metas
00:47:01
aquí la llamada
00:47:03
perímetro de pentágono
00:47:05
te va a devolver esta que te va a devolver cero.
00:47:06
Entonces, la aplicación va a funcionar.
00:47:11
El usuario se puede creer que el perímetro de ese pentágono es cero.
00:47:14
Y no, lo que pasa es que el desarrollador no hizo el método perímetro.
00:47:18
Luego, el tener que hacer aquí uno con un contenido absurdo,
00:47:24
aparte de feo, puede tener ese efecto.
00:47:30
Luego, ¿qué es lo que se hace en una situación como esta?
00:47:33
en la cual la superclase nunca va a ser instanciada.
00:47:36
Pues entonces, nosotros decimos,
00:47:41
oye, este método realmente lo que yo ponga aquí es un invento,
00:47:43
no vale para nada, no vale para nada.
00:47:47
Entonces no voy a poner nada
00:47:49
y lo voy a cerrar aquí con punto y coma.
00:47:51
Que es la primera vez en la vida
00:47:54
que después de un método, en lugar de abrir con llaves
00:47:56
y por el código que sea, cerramos con punto y coma.
00:47:59
Vale, pues podemos hacerlo.
00:48:02
Cuando lo cerramos con punto y coma,
00:48:04
lo que estamos diciendo es que ese método es abstracto.
00:48:05
Es decir, que está por definir, está por definir o por implementar.
00:48:10
Es una palabra más bonita.
00:48:28
Vale, justo.
00:48:30
Si el método es abstracto, estoy obligada a ponerle un abstracto, ¿vale?
00:48:33
Para indicarlo ahí.
00:48:41
Vale.
00:48:46
entonces, este método significa
00:48:46
que está por implementar
00:48:48
¿qué?
00:48:50
esto también lo podríamos hacer con lo de cliente
00:48:51
y cliente tienda y cliente online
00:48:53
sí, claro
00:48:54
si nunca más, si no va a haber clientes
00:48:57
solos, solamente va a haber cliente tienda
00:48:59
y cliente online sí
00:49:01
bueno, pues entonces
00:49:01
este método está por
00:49:05
implementar, luego
00:49:07
lo hemos convertido en abstracto y para ello
00:49:09
aparte de cerrarse con punto y coma hay que poner aquí
00:49:11
el abstracto, ahora ¿qué ha pasado?
00:49:13
Pues desde el momento en que una clase tiene al menos un método abstracto, al menos uno,
00:49:16
la clase se convierte en clase abstracta.
00:49:22
Y convertirse en clase abstracta, ¿qué implica?
00:49:28
Que para que el compilador se calle y todo encaja, estamos obligados a poner aquí abstracto.
00:49:30
¿Vale?
00:49:37
Sí, te lo pide seguro.
00:49:39
Vale.
00:49:41
Pues esto es una clase abstracta.
00:49:43
abstracta, clase abstracta, y ahora ya paramos un momentín, clase que tiene al menos un método abstracto, ¿vale?
00:49:44
De esa clase no se pueden instanciar objetos, desde el momento en que la ha convertido en abstracta
00:50:02
No se pueden instanciar objetos
00:50:17
Nada
00:50:19
Yo antes cuando no era abstracta
00:50:21
Podía haber hecho aquí un new figura geométrica
00:50:24
Y no habría pasado nada
00:50:26
New figura geométrica
00:50:28
Con su nombre y número de lados
00:50:30
Bueno tengo una figura geométrica
00:50:31
Podría haberlo instanciado
00:50:33
Pero si yo la hago abstracta
00:50:37
Ya no se puede instanciar
00:50:39
Si yo pretendiera aquí hacer esto
00:50:42
Esto con lo que fuera
00:50:45
el nombrecito que fuera y su número de lados
00:51:09
lo que me pida el constructor
00:51:12
pues no me deja, me deja
00:51:14
oye cuidado la clase es abstracta
00:51:17
luego no puedes instanciar esta clase
00:51:21
no puedes porque es abstracta
00:51:23
si yo no lo hubiera hecho como abstracta
00:51:25
es decir, esto en lugar de haberlo hecho así
00:51:27
hubiera optado por la otra opción que he dicho
00:51:31
dejar el método aquí vacío
00:51:34
o con un retún cualquiera
00:51:36
podría haber optado por este diseño
00:51:38
y si yo soy cuidadosa en todo lo que hago
00:51:42
y me acuerdo de sobre escribir
00:51:44
ahora bien los métodos perímetro
00:51:46
me acuerdo de hacerlo todo bien, la aplicación va a funcionar igual
00:51:47
pero aparte de que el diseño
00:51:49
es más feo, transmite un mensaje feo
00:51:52
y es que una figura geométrica abstracta
00:51:54
tiene un perímetro que es 7, pues no es mentira
00:51:55
pues aparte de eso
00:51:57
le doy la opción
00:51:59
al universo
00:52:01
de instanciar figuras geométricas
00:52:02
y eso no debería ser
00:52:05
porque eso no tiene sentido
00:52:07
una figura geométrica no se puede instanciar
00:52:09
se puede instanciar un cuadrado, un círculo
00:52:12
una figura geométrica que es
00:52:13
no es nada, no la puedo instanciar, no es real
00:52:14
no la puedo instanciar
00:52:17
luego, el diseño
00:52:18
es mucho más bonito
00:52:21
si yo identifico todo eso
00:52:23
que describe mejor mi situación
00:52:25
y digo, oye, este método está por definir
00:52:28
no tiene sentido que yo aquí lo defina
00:52:30
de cualquier manera
00:52:32
a la espera de que me sobrescriba, no tiene sentido
00:52:33
punto y coma, este queda por definir
00:52:36
le pongo el abstract
00:52:38
y ahora ya al haberle puesto el abstract
00:52:39
mi clase se convierte en abstract
00:52:43
y no pasa nada
00:52:45
acabo de prohibir
00:52:47
que me instancien
00:52:49
acabo de prohibir que me instancien
00:52:50
ya esto imposible, no me pueden instanciar
00:52:52
y aparte
00:52:54
he ganado algo más que lo decimos después
00:52:57
vale
00:52:59
me
00:53:00
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Primer Curso
- Subido por:
- Raquel G.
- Licencia:
- Todos los derechos reservados
- Visualizaciones:
- 15
- Fecha:
- 21 de enero de 2025 - 17:41
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 53′ 01″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 251.02 MBytes