Bienvenidos.
Continuamos con las clases abstractas.
Vamos a ver un ejemplo, pero un poco distinto la idea implementar un API librerías para formulario,
elementos formulario y acá vamos a tener una clase abstracta elemento form que hace completamente abstracto
y va a tener elementos hijos y cada uno va a tener su propia implementación, como por ejemplo un input
form que tiene varios tipos.
Puede ser, por ejemplo, una caja de texto, un input del tipo text, pero también puede ser un radio
button o puede ser un check boxes.
En fin.
Pero también un email o del tipo number, incluso del tipo button.
Del tipo submit.
Un botón.
Todos son del tipo input, pero además tex area.
Otro elemento formulario distinto y otro más.
El select form.
Una lista desplegable para seleccionar un elemento.
Cada uno tiene su propia implementación.
Por ejemplo, de cómo se dibuja en el HTML.
Cuál es el código HTML?
Por ejemplo, el select, el input y el text area tienen etiquetas y atributos completamente diferente.
Entonces son implementaciones distinta y la clase padre elemento del formulario va a tener el método
abstracto dibujar html.
Y esa es la idea.
Y también que se puedan validar validar cada campo, porque cada campo va a tener un valor que vamos
a llenar, por ejemplo con el teclado y lo tenemos que validar.
Entonces la idea e implementar también en esta misma nappy un sistema de validación, una clase validador
que también va a ser abstracta.
Por lo tanto, vamos a tener dos clases abstracta, un ejemplo completo y acá va a tener el método validar
o es válido, por ejemplo, con diferentes implementaciones, diferentes clases hija y cada una tener
una regla de validación diferente, por ejemplo y mail validador por validar un correo electrónico su
formato no nulo que no sea nulo.
Por ejemplo, otro validador requerido.
Otro validador número Valinor.
Que la información que ingresemos en este input o en este tex área o lista desplegable o lo que sea,
sea del tipo number, del tipo números, por ejemplo.
Y así también podríamos tener un validador de tamaño tenga entre tantos caracteres como mínimo y como
máximo tantos caracteres un rango.
Por ejemplo, el Yussef Beim que esté entre 4 y 12 caracteres se fijan diferente.
Vale, ahora son todos parte de la misma jerarquía de clases, una clase abstracta validador con métodos
abstracto validar, por ejemplo, o es válido y cada una implementa de forma distinta, porque la lógica
de programación el algoritmo es diferente.
Es distinto validar un correo electrónico que validar un número que validar si es requerido, validar
por rango de caracteres.
En fin, y por eso mismo vamos a comenzar con el diagrama de clases o M.L.
Para poder visualizar cuáles son todas las clases que interactúan en nuestro sistema, en nuestra API
y cómo se relacionan unas con otra.
Por ejemplo, elemento formulario con sus clases hijas.
El validador también está relacionado con los elementos.
En fin, ahí vamos a ver que cada elemento de formulario se le pueden agregar más de un valedor, una
lista, por ejemplo, pero que son cosas que vamos a ver en el ejemplo.
Entonces vamos a comenzar con las clases, vamos a crear primero elemento Form
Bean, voy a ampliar un poco y vamos a crear también la clase hija input form.
Perfecto.
Vamos a tener también Text Area Form
y por acá selecta
una lista desplegable.
Lo importante que cada uno se va a renderizar de forma distinta y va a tener sus propios atributos,
pero también va a tener atributos en común.
Y la clase padre un método abstracto, como por ejemplo el input form.
Vamos a ver que tiene el atributo tipo o type y así poder crear un input del tipo text o del tipo number
o del tipo password del tipo button del tipo submit.
En fin, diferente forma ven ahora la relación clase padre y clases hijas implementaciones concreta
entonces con la relación de herencia generalización flecha continua que termina en triángulo.
Hacemos un clic y creamos la relación.
Lo mismo acá.
Y lo mismo acá.
Vamos a ordenar un poco con la flecha.
Te alojamos acá?
Esto lo dejamos acá y este acá.
Bien, completemos entonces con clic derecho, elemento formulario, elemento for propiedades properties
y acá una clase abstracta.
Entonces marcamos esta casilla, este check box lo marcamos.
Si se fijan, cuando coloquemos aplicar ok, se marca en cursiva, queda en cursiva el nombre y eso
indica que es una clase abstracta númenes.
Se fijan solamente por la fuente cursiva.
Además, normalmente Properties vamos a colocar un estereotipo y acá vamos a indicar que es tipo abstracto.
Entonces escribimos la palabra abstracta y coloca entre los símbolos menor y mayor la palabra abstracto.
Aplicar.
Ok, se fijan sobre el nombre de la clase coloca, coloca como entre paréntesis triangular o menor y
mayor dos veces y la palabra, el estereotipo.
Esa sería la forma, pero siempre sobre el nombre, la clase.
Primero comencemos con lo más importante un método abstracto.
Por lo tanto, click derecho new operación va a tener una operación.
Un método abstracto.
Dibujar html bien.
Va a retornar un tipo string y tenemos que colocar que es una operación, un método abstracto acá.
Entonces también se va a colocar en cursiva del tipo públic y sin parámetros, sin argumento, solamente
va a renderizar el HTML correspondiente.
Ok.
Tipifican que iba en cursiva.
Dibujar HTML es un método sin implementación que lo tienen que implementar las clases, hija.
Entonces cada clase hija, vamos a crear este método.
Entonces es lo mismo dibujar HTML dentro de copiar.
Abstracto va a retornar un string perfecto o de Right, porquelos sobre Clive y lo implementa.
Ok.
Acá yo en cursiva.
Vamos a ver.
No debería estar en cursiva?
Nos vamos a operación.
No, acá no se coloca abstracto porque en la clase hija, okey, ahí se.
Un método que se escribe acá es abstracto y acá new operación.
Voy a pegar porque lo copié o right y retorna un string ok.
Y acá también.
Operación.
Oh, right.
Okay.
Ordenamos un poco.
Bien, sigamos con los atributos.
Por acá va a tener algunos atributos la clase padre en común a sus clases hijas.
Entonces atributo, por ejemplo, toda clase hija va a tener un nombre, un nombre campo del tipo String.
Lo dejamos en protected para que lo podamos obtener y utilizar en la clase hija.
Ok.
Queda como gato, es el símbolo de protector.
New Atributo.
Otro más.
Todos tienen un valor.
Entonces un nombre y un valor.
Del tipo String y.
Ok.
Y también va a tener validador, es un atributo.
Recuerden que cada elemento, cada campo de formulario se le puede agregar variadores, que iba a ser
del tipo validador, pero en realidad una lista de validar o un arreglo.
Pero en este ejemplo lo vamos a trabajar con el API list de Java, con el API de colección de Java,
pero lo vamos a ver por ahora.
List del tipo list.
Pero hacer una lista del tipo validador de la clase abstracta que después vamos a crear lo dejamos en
protected, ok?
Y también puede tener errores.
Claro, si se valida mal algún campo con algún validador podemos agregar mensajes de error para que
el usuario lo corrija.
Por ejemplo, el Yussef Name no puede ser vacío.
El correo tiene un formato incorrecto, no corresponde a un número.
Se fijan a atributo errores.
Va a ser del tipo string, pero también una lista o arreglo.
Lo dejamos como list del tipo list herrores protected.
Ok, ya.
Y también métodos va a tener un método.
La clase padre.
Pero va a ser un método que no es abstracto, va a ser un método concreto implementado que van a heredar
todas estas clases.
Entonces New Operación es válido.
Entonces por qué acampo se va a poder validar con este método?
Y por supuesto que retorna un tipo boolean truo fols.
Entonces bullían del tipo público.
No es abstracto, es común y corriente.
Y después vamos a ver en el código que internamente este método lo que hace es recorrer la lista de
los valedores con un for y por cada uno lo va a invocar.
El método es válido.
Década validador.
Y así validar el campo con sus distintas reglas de validación.
Y si alguno falla.
Bueno.
Se asigna el mensaje error en la lista de los errores y se retorna un fols.
Porque contiene errores, pero avienta esos detalles.
Después lo vamos a ver en el código y ok, ahí tenemos.
Es válido y en las clases cija no lo vamos a sobrescribir, simplemente lo vamos a heredar tal cual
como está implementado en la clase padre.
Por lo tanto, como no hay sobre escritura, no es necesario que lo implemente temás acá o que lo coloquemos,
simplemente se hereda.
Que otro método puede tener?
Bueno para agregar valedores entonces acá elemento form lo mismo new operación add validador agregar
validador va a retornar un tipo void.
Simplemente agrega un validador a la lista al elemento va a ser público.
Por lo tanto lo van a heredar las demás clases.
Iba a tener un parámetro, un argumento que del tipo validador nombre el tipo vamos a escribir acá validador
tal cual validador y a colocar este tipo se va a crear una clase del tipo validador ok.
Se fijan, ahí se creó la clase.
Ahí aparece.
Después vamos a utilizar porque iba a ser una clase abstracta.
Ok.
Se fijan, agrega un validador del tipo validador.
Ahora continuemos con los atributos propios de cada uno.
Porque ya tenemos los atributos en común con los métodos en común.
El método abstracto que Cesor escribe se implementa y acá atributos propios de cada implementación.
Por ejemplo, partamos acá input form new atributo type tipo del tipo string del tipo string.
Perfecto.
Valor inicial.
Vamos a colocar un valor por defecto del tipo text y private, porque solamente de la clase nada más
y listo.
Ok.
El tipo del tipo String y un valor por defecto texto, pero podría ser distinto, podría ser el tipo
tex, podría ser el tipo, pero bueno, como había explicado Radio Button o lo que sea y listo, nada
más.
En Tex Area vamos a tener un par de atributos, por ejemplo, filas y columnas, filas del tipo Integer.
Acá tenemos Integer.
Ok.
Y también.
Columnas también del tipo ínte ya.
Qué?
Y Select Form?
Un atributo.
Bueno, una lista desplegable o ComboBox es una lista, tal como dice el nombre, para seleccionar elementos
opciones en realidad.
Entonces a tener una lista de opciones o arreglo.
Por lo tanto, opciones del tipo listo.
Ok, privat bien, pero estas opciones base del tipo de una lista, pero de otra clase sería como un
arreglo del tipo.
Opción.
Entonces vamos a crear otra clase acá.
Opción Hote va a tener una relación de agregación.
Entonces la marcamos y acá se fijan, un campo select puede tener varias opciones para seleccionar,
por ejemplo seleccione un país y aparece una lista de países, se fijan y selecciona uno.
Esa es la idea.
Opción va a tener dos atributos nombre y valor del tipo String.
Y el valor también.
Puede ser del tipo string o del tipo Integer.
Lo dejamos del tipo string y valor, como por ejemplo poises, nombre, el nombre país, valor, el
código o identificador del país.
Ahí tenemos.
Bueno, y por supuesto acá también puede tener el método Agregar operación en Select Form.
Agregar add opción bueno, retorna void.
Simplemente agrega una opción a la lista.
Iba a tener un parámetro.
Opción del tipo opción, acá lo tenemos.
Ok.
Ok, estamos listos.
Listo nuestro diagrama.
Ahora faltaría el validador, pero acá lo tenemos, lo creamos por acá.
Cuando creamos este método, agregar validador, acá tenemos el tipo.
Por lo tanto, el tipo está por acá.
Oita entonces lo arrastramos.
Y lo dejamos acá.
Click derecho Propiedades.
Lo dejamos como una clase abstracta y el estereotipo también lo seleccionamos como abstracto, porque
ya lo creamos desde la clase anterior.
ÂQuÃ elementos forma entonces aplicar okei una clase abstracta?
Ahora, elemento form va a tener una lista de valores.
Por lo tanto, relación de agregación.
Hacemos un clic.
No se marcó de nuevo.
A veces no funciona bien de tema.
Ahora sí debería funcionar.
Ahí lo puso al revés.
Lo voy a mover acá.
Dablemente se pone un poco.
Lo voy a mover acá.
Ahí se fijan.
De repente se pone un poco mañoso el tema de las relaciones, como que no agarra bien, pero bien,
está bien.
Vamos a tener clases hijas diferentes, implementaciones del validador, por ejemplo.
Bueno, comencemos.
No nulo validador.
Ven acá, vamos a tener, por ejemplo, requerido
balear, bueno, requeria validador sería como lo mismo.
No empty o no vacío.
Es decir, valida que el string bueno exista por supuesto, pero que no venga vacío, mientras que no
nulo.
Que el valor no sea un objeto, una referencia null.
Ok.
Entonces, las relaciones diferencia.
Y acá también.
Te dejan ahí, no funcionó.
Entonces tenemos que mover esto por acá.
Volver a intentar.
Ahora lo movemos hacia abajo.
Vamos a crear otra clase por acá.
Número validador
OK.
Con la relación.
Tampoco.
Lo vamos a dejar más cerca.
Tampoco lo dejamos acá.
Si lo movemos al otro lado.
Acá.
A veces cuesta que tome bien la relación.
Puede ser un bug de un vuelo.
Algún problema que tenga?
Y por último, y mai validador,
aunque pudiera tener varios más.
También perfecto.
Ahí funcionó a la primera.
Se fijan vare clases hijas y meil, validador no nulo, validador requerido, validador número validador
y podríamos tener más todia.
Por ejemplo, rango o tamaño validador, es decir, que un carácter este entre tanto y tanto, en fin,
como por ejemplo bueno podría ser rango validador porque tamaño no, porque sicologo tamaño me obliga
a colocar la Ñ y no puede tener caracteres especiales.
Podría ser largo, eso sí, largo validador okei.
Entonces, que un valor, un string, este entre un mínimo de caracteres y un máximo de caracteres.
Y con eso, más que suficiente, podríamos tener muchos valedores más.
Y la clase atractiva la tenemos acá, la clase padre, tenemos parez clase hija, se fijan nuestro diseño
ya mucho más grande.
Pero bien, comencemos con lo importante.
Primero un atributo.
Mensaje claro qué puede ocurrir, un error.
Mensaje de error, pero simplemente le voy a colocar mensaje del tipo String.
Iba a ser, protestÃ.
Ya, pero cada Valledor va a tener su propio mensaje.
Por lo tanto es un atributo que cada uno va sobrescribir con, por ejemplo, el campo tiene que ser
del tipo número.
El campo es requerido.
El valor o el campo no poseen nulo.
No corresponde a un formato de correo electrónico.
El Yussef name o el string está fuera del rango, ya hace que tenga menos caracteres o más caracteres.
En fin.
Bien.
Qué más?
Continuemos.
Métodos o operaciones abstracta.
Así que la marcamos altiro como una operación abstracta.
Abstract Operación nombre es válido?
Puede ser es válido o validar como queramos.
Es válido está bien del tipo boolean para retornar true o fols.
Y en este método implementamos la validación de cada uno.
Cada uno se implementa de forma distinta.
Parámetros importantes.
Vamos a agregar el parámetro que va a ser el string el valor, el valor de cada campo de formulario
que se va a validar con este algoritmo.
Con esta implementación tipo String OK.
Es válido?
Valor del tipo String y retorna en bullían y en cursiva, porque es abstracto.
Cada uno tiene que implementar este método.
Vamos a ordenar un poco.
Ahí, entonces, bueno, tenemos que implementar en cada uno el mensaje y este método es válido, pero
además la clase padre abstracta validador va a tener dos operaciones más el método GET y el método Set.
Importante, porque después el código lo vamos a ver.
Entonces van a ser métodos abstractos.
Es importante que las clases hijas implementen estos métodos que eran setter del tipo abstracto.
Después el código lo voy a explicar un poco mejor y lo vamos a visualizar, pero es abstracto.
Get mensaje Barton nar un tipo string y sin parámetro.
Ok.
Y también el set.
También un método abstracto va a retornar un tipo bait y argumento
mensaje del tipo String.
Ok.
Ok, entonces 3 métodos abstracto cómo el mensaje es protected lo tienen que escribir cada clase hija
y cómo los Ori escribe con su propio valor, con su propio texto del mensaje error.
También tiene que sobrescribir hectómetros implementar estos métodos que tras setter para el mensaje,
entonces al final cada clase hija.
Va a tener estos miembros mensaje y estos dos métodos y estos tres métodos abstracto bueno, y lo tengo
que implementar una por una.
Entonces, por ejemplo, atributo.
Mensaje del tipo protected, del tipo String.
Otre.
También acá.
Del tipo string protected.
Y en todo vimos.
Por último, acá.
Luego es válido operación, un método no es abstracto porque es una clase hija.
Acá lo vamos a sobreescribir.
Por lo tanto, over right del tipo bullían.
Y parámetro valor del tipo String, idéntico al padre, que es abstracto pero acá implementado, concreto,
se fijan es válido e válido valor, valor del tipo string bullían y así cada uno implementa este método
con su propia forma implementación.
Bullían Brid.
Nuevo parámetro, valor del tipo estric.
Qué me falta?
Get mensaje y set message.
También por cada uno hay que implementar tu método, sobrescribir.
Lo voy a copiar del tipo String porque retorna el mensaje over right.
Si el parámetro get solamente ok.
Right?
Del tipo String.
Ó T?
Oh, right.
Ok.
Over right, ok.
Y faltaría los último nomá por cada uno.
Atributo set mensaje lo voy a copiar, voy.
Oh, right?
Parámetro.
Mensaje del tipo String.
Okay, okay.
Boy o right parámetro.
Mensaje del tipo String.
Ok, ok.
Y por último, el largo.
Oh, right boy.
Y el parámetro?
Ok, ok, ya tenemos quizás el largo valedor pudiera tener un par de atributos propio.
Privados, por ejemplo, el mínimo del tipo Integer.
Ok.
Y también podría tener el máximo.
También del tipo Integer.
Encanté caracteres que tener este valor, este street, ya decir que estamos listo con nuestro diseño.
Bueno, eso lo tenemos que implementar en esta sección.
Va a ser un ejemplo bien completo, contó clases abstracta.
Es decir, vamos a tener dos ejemplo en uno solo para elementos formulario y para que a su vez se pueden
paliar con variadores y elemento.
Puede tener o se le puede agregar más de un valor, más de una regla de validación.
Por ejemplo, que tengo formato de correo electrónico, pero que a su vez no sea vacío, sea requerido.
Se fijan y así bien y todos los detalles lo vamos a ver, revisar e implementar en el código.
Nos vemos en la siguiente clase.