Clases Abstractas: ejemplo - 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:
Vale, voy a grabar este ejemplo así si habláis, si os interesáis a grabar vuestra voz, ¿vale?
00:00:00
Entonces voy a crear un pequeño ejemplo de clase abstracta, ¿vale?
00:00:08
Lo hemos hablado tanto, mucho, por lo tanto vamos a trabajar con esto de las figuras geométricas
00:00:13
porque es más o menos más claro en la cabeza, como primer ejemplo.
00:00:18
Luego hacemos ejemplos sobre otras cosas, ¿vale?
00:00:23
Entonces, voy a crearme una clase, que es la clase figura o figura geométrica, ¿vale?
00:00:24
Esta clase de aquí quiero que sea una clase abstracta, es decir, por ahora no dejamos las abstractas, luego así vemos qué pasa, ¿vale?
00:00:34
Entonces, una clase figura, cuando tengo una figura tengo que tener algo común a todas las figuras del multiverso.
00:00:43
que tiene en todas las figuras del multiverso, triángulo, cuadrado, rectángulo, y un método
00:00:50
que por ejemplo es si public void dimeLados que dice si tengo más numLados, string s es igual
00:01:05
a numlados
00:01:38
si
00:01:41
numlados
00:01:48
menos o igual a cero
00:01:52
S es igual
00:01:54
infinitos
00:01:58
¿Os gusta?
00:02:01
Así cuando tengo el círculo
00:02:10
le pondré cero lados
00:02:11
y así me dice que tiene lados infinitos.
00:02:14
¿Sí?
00:02:18
Va, ok.
00:02:19
Esto es mi figura.
00:02:20
Voy aquí
00:02:24
y digo
00:02:25
hago un main
00:02:28
una clase main para probar estas cosas
00:02:31
y ahora nadie me prohíbe de crear
00:02:33
un objeto figura
00:02:40
figura f
00:02:41
es igual a new figura
00:02:44
f.numLados
00:02:46
es igual a 4
00:02:51
y ahora digo
00:02:54
F punto
00:02:57
Dime lados
00:03:00
¿Vale?
00:03:01
Aquí
00:03:03
Tengo cuatro lados
00:03:03
Le pongo cero lados
00:03:07
Y dice tengo infinitos lados
00:03:09
¿Sí? ¿De acuerdo?
00:03:12
Vale, esto feo
00:03:14
¿Vale? Hemos dicho no lo quiero hacer
00:03:15
Lo quiero poner aquí
00:03:18
Entonces necesito
00:03:19
Un constructor, me voy aquí y me hago un constructor
00:03:22
Figura
00:03:24
public figura de int numlados, dis.numlados, es igual a numlados, t. Función. ¿Dudas hasta aquí?
00:03:27
Vale. Ahora, aquí subentra el concepto de val, pero esta clase versífigura es relativamente fea,
00:03:51
vale en el sentido que ahora yo se me ha quedado un poco coja porque en realidad la figura tiene
00:03:59
muchas otras cosas en común todas las figuras que pero no las estoy poniendo aquí porque no
00:04:07
puedo porque podría decir vale yo quiero que las figuras puedan calcular su área puedo saberla aquí
00:04:11
no entonces me bloqueo pero si dijera hoy mira yo quiero que cuando uno usa esta figura pues
00:04:17
sea obligado a implementar algunos métodos que todas las figuras tienen, como por ejemplo
00:04:26
el calcular su área.
00:04:33
Pues entonces decido, digo mira, voy a ponerlo así, este es el cústico, voy a decir public
00:04:35
abstract doble calcula área punto com.
00:04:44
Esto se enfada, ¿vale?
00:04:51
Pero lo que estoy diciendo aquí es, si yo quiero ahora construir un método que exista
00:04:56
en la figura, que no puedo saber cómo se implementa, pero que si alguien hereda de
00:05:00
mí sea obligado a implementarlo, y que sepa implementarlo, cuando el cuadrado implementará
00:05:08
la figura, pues lo hará, ¿vale?
00:05:16
Entonces, ¿qué voy a hacer aquí?
00:05:20
se enfada porque me dice,
00:05:24
the abstract method
00:05:25
can only be defined
00:05:26
by an abstract class.
00:05:29
No puedo definir
00:05:31
un método abstracto
00:05:32
si la clase no es abstracta.
00:05:33
No problemo.
00:05:35
Mi clase es abstracta.
00:05:40
Todo fenomenal.
00:05:42
Oye, como un constructor
00:05:43
de una clase abstracta,
00:05:45
si no puedo construir
00:05:46
la clase abstracta,
00:05:47
no, no puedo.
00:05:48
Y de hecho,
00:05:49
se enfada.
00:05:51
No se puede construir
00:05:55
una figura.
00:05:56
La figura es abstracta.
00:05:58
Si yo construyera una figura, me quedaría este método y ¿qué hago con ello?
00:05:59
¿Me entiende?
00:06:08
¿Dudas hasta aquí?
00:06:10
¿Vamos?
00:06:14
Entonces ya no puedo crear figuras.
00:06:15
Si voy aquí, me dice, cannot distance the type figura.
00:06:18
No puedo distanciarla por el tipo figura.
00:06:22
¿Por qué? Porque es astral.
00:06:24
Pero si tengo un constructor.
00:06:26
Si el constructor me sirve para crear este objeto, ¿vale?
00:06:29
desde una subclase.
00:06:33
O sea, la subclase llamará a este constructo
00:06:36
para implementar la parte
00:06:38
de en un lado.
00:06:39
Pero por sí mismo no se puede llamar.
00:06:41
Esto fue.
00:06:47
Vale, muy bien.
00:06:48
Entonces estamos aquí.
00:06:50
Me creo otra clase. Vamos a
00:06:52
implementar. Me creo otra clase de rectángulo.
00:06:53
Rectángulo.
00:06:58
Rectángulo
00:07:03
que tiene, tiene int
00:07:04
lado horizontal
00:07:07
int
00:07:09
lado vertical
00:07:11
¿si?
00:07:13
cuidado, rectángulo ¿qué es?
00:07:16
una figura
00:07:18
entonces puede decir
00:07:19
extends
00:07:21
figura
00:07:23
¿vale? y se enfada
00:07:24
¿por qué se enfada?
00:07:27
porque en el momento en que extendo una clase
00:07:32
abstracta
00:07:35
¿vale?
00:07:36
pillo el deber de implementar todos sus métodos abstractos.
00:07:38
Y no lo he hecho.
00:07:44
Además, esto se enfadará probablemente por el constructor.
00:07:46
Sí, implicit sobre constructor.
00:07:50
Vamos a ver que si pongo el constructor,
00:07:52
public rectángulo que pilla 4,
00:07:53
no, int lado h, int lado v, lo que hace es super 4, dis.lado h es igual a lado h, dis.lado v es igual a lado v.
00:08:02
Sí, lo que decíamos ayer, el número de lados de un rectángulo siempre será 4, no lo hago pasar por parámetros, no puedo hacer rectángulos de 7 lados, que no existen, ¿sí? Claro, entonces, si ahora hago así, él sigue enfadándose, pero, oye, estoy usando ahora, no estoy usando el constructor por defecto, estoy usando el constructor definido aquí, no entiendo por qué te enfades,
00:08:28
Aquí me dice, the type Rectangulo must implement the inherited abstract method figura.calcularia.
00:08:53
El tipo Rectangulo tiene que implementar el método abstracto heredado calcularia.
00:09:02
Tiene que hacerlo.
00:09:12
De hecho aquí me da también quick fixes de, oye mira que hago.
00:09:13
Y hay dos opciones.
00:09:18
Añade los métodos no implementados
00:09:18
O otra opción
00:09:22
Haz que el rectángulo sea abstracto
00:09:23
Podría ser que esta clase
00:09:26
Yo tenga figura
00:09:28
Luego tenga figura plana
00:09:29
Y figura 3D
00:09:31
¿Vale?
00:09:32
Entonces figura es para todos
00:09:33
Y de ellos heredan figura plana o figura 3D
00:09:35
Y estas también sean abstractas
00:09:39
Y luego desde figura normal, plana
00:09:41
Heredan rectángulo cuadrado es lo que tenemos
00:09:44
y de figura 3D eran esfera,
00:09:47
cubo y cosas por el estilo.
00:09:49
Puedo heredar y ser abstracto.
00:09:52
Si soy abstracto, no necesito
00:09:55
implementar nada. Puedo implementar
00:09:57
o no.
00:09:59
Entonces, a nosotros nos interesa
00:10:02
esta opción, ¿vale? Aquí.
00:10:03
Este era el método
00:10:06
que me faltaba.
00:10:07
Entonces, public double calcularia
00:10:09
return 0 porque
00:10:11
él no sabe cómo hacer.
00:10:13
Yo sé que tengo que hacer return.
00:10:14
lado H por lado V. Perfecto. Ya lo tenemos. Ahora tenemos figura que es abstracto, no puedo
00:10:18
calcularlo, rectángulo que cuando creo un rectángulo me llama, me crea una figura y una vez creada la
00:10:35
figura implementa lo que sea. Y implementa, fijaos, le hice el overwrite. Aquí me está definiendo que
00:10:41
este de aquí está overheadando este de aquí. Esto me sirve porque hago un control del procesador
00:10:49
que entiende que mi intención es hacer un override de este nombre aquí, de este método aquí,
00:10:58
y si me equivoco y no lo hago exactamente igual, me da un error. Por ejemplo, si yo quito esto,
00:11:09
perfecto. Pero en el momento en que le digo que es un override, me está diciendo, mira, tú estás
00:11:20
intentando overridear, pero no existe este método para sobrescribir. Este método, con el entero,
00:11:27
con esta firma, no existe en la clase superior. Está diciendo, el método calcular a int, vale,
00:11:36
del tipo rectángulo.
00:11:45
Mast Override and Implemented
00:11:46
or Supertype Method.
00:11:47
Esto, calcular el int,
00:11:50
debería estar en el padre.
00:11:53
Y no está.
00:11:56
Por lo tanto, no me puedes meter Override.
00:11:57
Es como una forma extra
00:12:01
para estar seguro que si yo estoy
00:12:04
declarando, lo voy a sobrescribir
00:12:06
y él me ayuda a decir, vale, si lo has
00:12:08
sobrescribido correctamente o no.
00:12:10
De esta forma.
00:12:13
Así.
00:12:15
¿Esto está bien? Vamos a jugar con él. Entonces, ¿qué puedo hacer ahora? Puedo crear un rectángulo.
00:12:15
Dejadme antes de jugar hacer otra cosa. Crea una cosa solo para rectángulos.
00:12:27
Que es public void rectanglear. Que solo lo pueden hacer los rectángulos.
00:12:32
¿Vale? Es decir, si yo soy muy rectángulo y mucho rectángulo, está rephraseando algo.
00:12:45
¿Sí? Entonces, ¿ahora qué puedo hacer aquí? Puedo crear un rectángulo.
00:12:57
Rectángulo, R es igual a new rectángulo.
00:13:05
parámetros, tengo que poner
00:13:09
el lado horizontal y vertical
00:13:14
7, 3
00:13:16
vale, fenomenal, y ahora que puedo hacer
00:13:18
con rectángulo, R punto
00:13:22
pues puedo acceder a su lado
00:13:24
H, puedo acceder a su lado V
00:13:26
puedo acceder a num lados
00:13:28
que es del padre, veis que es de figura
00:13:30
aquí no puedo hacer zoom
00:13:32
porque a veces se me bloquea el vídeo
00:13:34
si a vosotros
00:13:36
no lo veis
00:13:37
está en streaming
00:13:39
luego está calcularia
00:13:41
que es de rectángulo
00:13:45
también dimelados que es de figura
00:13:46
o sea yo desde aquí puedo acceder
00:13:48
a todo lo que es rectángulo
00:13:51
y a todo lo que es figura
00:13:52
también puedo rectangulear
00:13:54
que es una cosa solo de rectángulo
00:13:57
que no existe en figura
00:13:59
¿sí?
00:14:00
puedo hacer todas estas cosas
00:14:02
entonces le puedo decir
00:14:03
siso r.calcularia
00:14:04
Luego puedo hacer R.rectangular.
00:14:11
Luego puedo hacer R.dimelados.
00:14:17
Todo esto funciona.
00:14:22
¿Vale?
00:14:26
Fijaos que esto es de figura sobre escrito en rectángulo.
00:14:29
Esto es solo de rectángulo.
00:14:36
Y esto es solo de figura.
00:14:40
sea definido en figuras y no sea sobre escrito en rectángulos. Puedo usar métodos sobre escritos,
00:14:42
métodos míos y métodos de mi padre. ¿Duda hasta aquí? Vale. Otra cosa que puedo hacer es,
00:14:50
figura f es igual a new rectángulo de 3, 4. Ahora, si yo hago este punto, aquí me aparecen
00:14:57
numlados, me aparece calcularia, me aparece bimelados, pero no me aparece ni
00:15:20
rectángular ni calcular de figura. Entonces vamos a ver qué pasa. Primero no puedo acceder, no me
00:15:27
aparecen ni lado h ni lado v. No puedo acceder a esas variables porque ellos son una figura como
00:15:37
referencia. El rectángulo es una figura. Como mi manejador del objeto es una figura,
00:15:45
sólo puede usar los comandos de figura. No puede usar los comandos del rectángulo. ¿Se entiende?
00:15:53
Entonces, yo aquí puedo hacer este punto,
00:16:03
Dime lados
00:16:08
Y va a funcionar
00:16:11
Perfectamente
00:16:15
Tengo cuatro lados
00:16:16
Pongo un círculo divisorio
00:16:19
Esto lo escribe el primer objeto
00:16:29
Hasta aquí
00:16:33
Y luego empieza otro objeto
00:16:33
¿Vale?
00:16:36
Y este objeto dice
00:16:37
Tengo cuatro lados
00:16:38
Ahora, si yo hago esto mismo
00:16:39
Con este
00:16:43
Este calcular
00:16:46
es el de figura o el de rectángulo
00:16:52
por
00:17:09
por qué por
00:17:14
por
00:17:18
por
00:17:20
por
00:17:30
Estoy llamando
00:17:34
el método de rectángulo
00:17:43
y no de figura por
00:17:46
¿Por qué estaba acercando a la instancia?
00:17:47
¿Al método de la instancia?
00:17:53
Por
00:17:56
¡Exacto!
00:17:57
Por
00:18:04
¿Qué estamos estudiando esta mañana?
00:18:05
Ah, porque es polimórfico
00:18:09
Pero es un método polimórfico.
00:18:11
¡Por polimorfismo! ¡Muy bien!
00:18:13
Habéis llegado enseguida.
00:18:16
¿Vale?
00:18:18
¿Sí?
00:18:19
Y la razón es...
00:18:21
O sea, por polimorfismo, y nosotros
00:18:23
informáticos los entendemos. ¿Vale?
00:18:25
Si lo quiero explicar, pues porque
00:18:27
efectivamente se usa el método
00:18:29
de la instancia,
00:18:31
no de la referencia.
00:18:33
La referencia es de tipo figura,
00:18:36
pero la instancia es un rectángulo.
00:18:39
Entonces va a usar
00:18:40
Calcular
00:18:42
Por otro lado, ¿existe calcular en figuras?
00:18:43
No
00:18:47
No está definido
00:18:48
Entonces, ¿qué debería hacer?
00:18:49
Lo puedo usar sobre una figura
00:18:54
Justo porque en realidad
00:18:56
Es un rectángulo
00:18:58
Y estoy usando su versión rectangular
00:18:59
De la del calcular
00:19:03
Estoy usando calcular del rectángulo
00:19:05
Sí
00:19:07
O sea, has creado
00:19:08
un objeto nuevo
00:19:10
con la clase figura
00:19:11
que es un rectángulo
00:19:14
con la clase rectángulo
00:19:16
pero diciendo que
00:19:17
su referencia, su tipo de variable
00:19:19
es una figura, ¿por qué puede hacerlo?
00:19:22
porque rectángulo es una figura
00:19:24
es
00:19:26
píllalo con las, cuando yo te digo
00:19:29
float
00:19:32
f
00:19:34
no, mi
00:19:37
número es igual a
00:19:38
5
00:19:40
5 es un float
00:19:41
no, pero entonces ¿por qué me lo pilla?
00:19:43
porque 5 es también un float
00:19:49
un float no es un int
00:19:51
pero cualquier int es un float
00:19:56
para esto extrae números primitivos
00:19:57
entonces píllalo con la
00:20:03
con pizzas
00:20:04
¿sí? pero la idea es esa
00:20:06
cualquier rectángulo es una figura
00:20:09
entonces yo puedo decir
00:20:11
ay mira, esta es una figura, sí
00:20:13
pongo dentro un rectángulo perfecto ahora el manejador el que decide qué puede hacer es de
00:20:15
tipo figura entonces cuando hago este punto me saldrán todas las opciones que tiene una figura
00:20:22
o un rectángulo el rectángulo tiene cosas extra para hacer él no puede hacerlas pero todo lo que
00:20:28
puede hacer una figura, lo puede hacer. Porque el rectángulo es una figura. Esto es un up-casting.
00:20:37
No, porque si ahora yo quisiera decir, vale, ok, pero yo sé que f es un rectángulo. ¿Puedo usar
00:20:52
algo de rectángulo? ¿Puedo hacer este método de aquí que es sólo de rectángulos usando f? No,
00:21:00
No, porque si yo hago este punto, no aparece aquí rectángulear.
00:21:09
Porque una figura no puede hacer como un rectángulo.
00:21:15
Es el rectángulo que hace así.
00:21:18
Pero ella lo que puede hacer es decir, oye, mira, espera, espera, espera.
00:21:20
Rectángulo.
00:21:24
F, para que se entienda.
00:21:28
Punto.
00:21:33
Y ahora me está diciendo, pilla este.
00:21:35
Trátalo como si fuera un rectángulo.
00:21:37
Y a este punto me salen todas las opciones que puedan hacer un rectángulo, ¿vale?
00:21:40
Incluido rectangulear.
00:21:47
Y me funciona.
00:21:50
Porque en realidad F es una referencia de tipo figura, pero dentro tiene un objeto rectángulo.
00:21:53
Entonces puede hacer un...
00:22:00
Explícito.
00:22:03
Es explícito.
00:22:05
Hacer un downcasting explícito
00:22:07
Al decir, oye mira, tú eres una figura, lo sé
00:22:10
Pero compórtate como un rectángulo
00:22:12
¿Por qué? Porque lo digo yo
00:22:14
¿Está claro?
00:22:16
¿Qué es?
00:22:18
No me lo va a hacer
00:22:22
No me permite hacer, ¿vale?
00:22:22
Necesito otra parte
00:22:49
Lo hacemos solo en un minuto
00:22:50
¿Vale?
00:22:52
Vamos a hacer
00:22:52
Triángulo también
00:22:54
O otra cosa
00:22:56
¿Vale?
00:22:58
Necesito triángulo, triángulo, el triángulo que tiene, tiene interlado uno, interlado dos, interlado tres, extensa figura, aquí tiene public, triangle, surche, constructorus infilde, tac, tac, tac, tac, ¿vale?
00:22:58
de un lado se los quito
00:23:38
le pongo 3
00:23:40
vale
00:23:42
y
00:23:43
como estoy extendiendo triángulos
00:23:45
la figura se enfada
00:23:48
porque dice le falta
00:23:50
los métodos he dedicado
00:23:51
entonces los añado
00:23:54
como calculo la área del triángulo
00:23:56
pues no tengo ni idea
00:23:59
pues
00:24:00
da siempre
00:24:01
hay una fórmula para calcular la área del triángulo
00:24:03
a partir de los lados, pero no me las he de vengar, ¿vale?
00:24:06
Es solo base para el truco.
00:24:10
Pero luego lo modificamos, a lo mejor esto hace unas cosas raras.
00:24:13
Si ahora vuelvo aquí y le digo, oye, mira, haz un casting petra,
00:24:19
que aquí le hago el método que solo los triángulos pueden hacer,
00:24:31
que es public void triangular.
00:24:34
que dice inciso triángulo. Si ahora yo le digo a esta figura, que es una figura, que es un
00:24:37
rectángulo, oye mira, puede ser un triángulo y triangulear. Él me dice claro, cómo no, soy una
00:24:57
figura, existe triángulo que hereda de figura, pues te voy a tratar como un triángulo. Yo lo
00:25:11
lanzo y ¿qué pasa? Explota. Con una class-cast exception. Tú eres un rectángulo, me estás
00:25:20
diciendo trátame como un triángulo, pero yo no tengo dentro la estructura de un triángulo,
00:25:34
entonces no puedo ser un triángulo. Yo tengo todo lo que tiene figura y todo lo que tiene
00:25:41
un rectángulo. Si tú me dices, úsame como figura, fenomenal. Úsame como rectángulo, fenomenal.
00:25:46
Pero cuando tú me dices, oye, mira, úsame como un triángulo, pues no es correcta.
00:25:51
No es un casting correcto. No puedo tratar un cuadrado, un rectángulo, como si fuera un triángulo.
00:25:57
Entonces, él explota. Cuidado que no lo entiende él.
00:26:04
Porque una figura, técnicamente, es castigable a un triángulo.
00:26:10
si tú aquí en vez de
00:26:14
new rectángulo hubieses hecho new triángulo
00:26:17
pues lo habrías podido hacer
00:26:19
¿entiendes?
00:26:21
pero no lo puedes hacer con este
00:26:27
rectángulo de aquí
00:26:29
que da la posibilidad
00:26:30
de cerciorarme
00:26:35
si
00:26:38
f instancio
00:26:39
triángulo
00:26:42
entonces hablo
00:26:47
triángulo
00:26:51
and say if
00:26:55
f instancio cuadrado, no, que es rectángulo, pues entonces, rectángulo f, punto,
00:27:01
¿me entiendes? Si yo no lo sé, si este es un triángulo o un rectángulo, porque me lo han dado por teclado,
00:27:25
porque está en un array, porque no lo sé qué.
00:27:55
Siempre me puedo preguntar, oye, mira,
00:27:57
si eres un triángulo, entonces da un
00:27:59
cast a la triángulo y usa los métodos
00:28:01
de triángulo. Si es un rectángulo,
00:28:03
da un cast a un rectángulo y usa
00:28:05
los métodos de rectángulo.
00:28:07
¿Está de acuerdo con esto? ¿Está aquí?
00:28:12
¿Sí?
00:28:15
Entonces,
00:28:16
cosa uno,
00:28:18
me creo un rectángulo
00:28:20
y tengo rectángulo, ¿vale?
00:28:22
Y uso como referencia un rectángulo.
00:28:24
Esto puede hacer todo lo que hace un rectángulo.
00:28:26
opción número 2 crea un rectángulo pero lo pongo dentro de la figura esto puede hacer sólo lo que
00:28:28
hace una figura a menos que no haga un down casting explícito siempre y cuando pueda hacerlo
00:28:34
ya seguro que lo esté seguro que lo puede hacer la tercera opción que venía aquí era
00:28:44
es crear un padre con tipo padre pero aquí no lo puede hacer puede hacer figura este
00:28:53
F2 es igual a new figura de 3. ¿Por qué no? Porque es una clase abstracta. Si la clase
00:28:58
es abstracta no puedo crearla. ¿Dudas? Vamos a crear una clase nueva. Cuadrado. ¿De qué
00:29:11
era el cuadrado? Extends. Rectángulo. Bueno, implícito sobre constructo de rectángulo
00:29:28
no funciona vale public cuadrado intel super l l lo veis cuadrado es un rectángulo con todos
00:29:51
los lados iguales y mi constructor de rectángulo pillaba los dos lados vertical y horizontal pues
00:30:14
le estoy pasando como parámetros el mismo para que el vertical y horizontal tengan el mismo tamaño
00:30:21
en automático esto me costará me costará una figura de cuatro lados tendré una figura de
00:30:27
cuatro lados con alrededor un rectángulo que tiene el lado del lado iguales y comentó con
00:30:37
alrededor este cuadrado aquí sí cuadrado porque yo estando de rectángulo porque yo estando rectángulo
00:30:44
entonces ahí está.
00:30:59
¿Y por qué has puesto un solo parámetro
00:31:03
en el constructor de cuadrados?
00:31:05
Porque ¿cuántos parámetros necesitas
00:31:07
para un cuadrado?
00:31:09
Te dices, un cuadrado de lado 2 y 2.
00:31:13
O dices, un cuadrado de lado 2.
00:31:17
Aquí, cuadrado de lado 2.
00:31:19
Luego te lo duplico
00:31:21
porque en mi estructura
00:31:22
del ejemplo que estoy haciendo,
00:31:24
pues el rectángulo necesita dos lados,
00:31:25
el horizontal y el vertical.
00:31:27
Pues horizontal y vertical son
00:31:29
dos y dos.
00:31:30
para que sean cuadrados.
00:31:34
Tened en cuenta que aquí tengo que sobreescribir, calcular área.
00:31:37
No, porque técnicamente yo estoy redando el de rectángulo
00:31:43
y ya rectángulo lo ha implementado.
00:31:52
Entonces no hay problema, está implementado ya.
00:31:55
¿Me vale el calcular área de rectángulo?
00:31:58
Sí, porque sustancialmente estos serán igual, me están haciendo dos por dos.
00:32:01
¿Vale? Vamos a complicarlo un poquito. Vamos a poner que la figura, además de este método abstracto, tiene también el método abstracto, cálcula perímetro, entonces errores por todos lados, triángulo, cálcula perímetro del triángulo, pues vamos a crear cálcula perímetro y será lado 1 más lado 2 más lado 3.
00:32:06
Justo. Vale. Me voy al rectángulo. El rectángulo me dice, oye, mira, no está implementado. Vamos a implementar.
00:32:39
¿Cómo se calcula el perímetro del rectángulo? 2 por lado H más 2 por lado V.
00:32:50
Bueno, vale. Quería hacer una cosa distinta, pero... ¿Sí?
00:33:00
Y hacemos también que esto escriba RECTÁNGULO PERÍMETRO.
00:33:06
El método calcula perímetro escribe soy rectángulo, calculo mi perímetro y lo calculo.
00:33:20
Imaginámonos que ahora a nivel de cuadrado quiera sobreescribir también eso.
00:33:44
Entonces le pongo atoverride
00:33:53
y le pongo
00:33:55
esto aquí. Y ahora digo, soy cuadrado.
00:34:01
Y aún
00:34:15
si esto me vale,
00:34:15
pues lo que hago yo ahora es
00:34:17
4 por lado h.
00:34:19
Misma cosa.
00:34:27
Me valía el otro. Pero es para ver que
00:34:28
ahora escribo otra cosa.
00:34:30
Entonces
00:34:33
me vuelvo a mi main y voy a
00:34:33
jugar con esto.
00:34:36
Voy a
00:34:38
anular todo.
00:34:39
Y va a crear un rectángulo.
00:34:42
Nu rectángulo 7, 3.
00:34:48
Otra vez.
00:34:54
2, 3.
00:34:55
Y luego un cuadrado.
00:34:58
Es igual a nu cuadrado.
00:35:01
Y luego figura F1.
00:35:09
Es igual a new rectángulo de 5, 6.
00:35:15
Y figura fc2 es igual a new cuadrado de 5.
00:35:24
Si ahora yo llamo r2.calculaperímetro,
00:35:33
que me hará, dice, soy un rectángulo perímetro y calculará superado, ahora no lo sé cuánto es.
00:35:40
Dame un segundo, que así acabo. Esto me dice el perímetro, pero lo ha calculado como rectángulo.
00:35:51
¿Lo veis? Si ahora hago lo mismo usando C, ¿qué hará? Usa cuadrado. Y hasta aquí todo bien.
00:36:07
Si ahora hago lo mismo y pongo S1, ¿qué hará? ¿Qué método usa? El de figura.
00:36:26
¿El de rectángulo o el de cuadrado? El de rectángulo. ¿Veis? ¿Por qué? Porque soy una referencia de tipo figura, pero dentro soy un rectángulo y se usa el método de la estancia.
00:36:40
último
00:37:01
¿cuál se usa?
00:37:07
el de cuadrado
00:37:16
porque soy una referencia de figura
00:37:17
pero en realidad soy un cuadrado
00:37:24
perdón, necesito lo último
00:37:28
rectángulo R3
00:37:30
es igual a
00:37:34
µ cuadrado
00:37:36
de 7.
00:37:38
¿Lo puedo hacer?
00:37:40
Sí.
00:37:42
El cuadrado es un rectángulo.
00:37:43
Y si ahora hago esto otra vez
00:37:46
y hago R3,
00:37:49
¿qué hace?
00:37:51
Cuidado que el rectángulo lo tiene.
00:37:53
¿Qué hago?
00:37:54
¿Cuál usa?
00:37:55
El de cuadrado.
00:37:58
Porque dentro es un cuadrado.
00:38:00
Aquí escribo rectángulo cuadrado.
00:38:04
esto es perímetro
00:38:06
hay que cambiar
00:38:08
ahora lo volvemos a rehacer
00:38:09
y reanudar
00:38:11
- Materias:
- Programación
- Niveles educativos:
- ▼ Mostrar / ocultar niveles
- Formación Profesional
- Ciclo formativo de grado superior
- Segundo Curso
- Autor/es:
- Stefano Chiesa
- Subido por:
- Stefano C.
- Licencia:
- Reconocimiento - No comercial
- Visualizaciones:
- 6
- Fecha:
- 19 de enero de 2026 - 11:55
- Visibilidad:
- Clave
- Centro:
- IES ROSA CHACEL
- Duración:
- 38′ 16″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1920x1080 píxeles
- Tamaño:
- 321.00 MBytes