Diferencia entre revisiones de «Plantilla:PHP/Herencia»
De WikiEducator
(→Clases Abstractas) |
|||
(29 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 1: | Línea 1: | ||
===Herencia=== | ===Herencia=== | ||
*La herencia es un mecanismo de programación que me permite crear una jerarquía en los componentes software, que se pueden ir especializando | *La herencia es un mecanismo de programación que me permite crear una jerarquía en los componentes software, que se pueden ir especializando | ||
− | + | *Es principio de abstracción por el cual podemos crear una jerarquía de clases, donde tenemos la raíz con los elementos comunes y en los nodos vamos especializando clases. | |
− | + | *La idea es definir una clase con ciertas características comunes (atributos, métodos) | |
+ | Posteriormente crearemos otras clases a partir de la ya existente, quedando implícitamente los atributos y métodos como también parte de su estructura o composición. | ||
+ | |||
*Es una característica muy natural (p.e Personas (médicos y bailarines) vehículos (Terrestres (coche, moto) Acuáticos (barco, lancha)) | *Es una característica muy natural (p.e Personas (médicos y bailarines) vehículos (Terrestres (coche, moto) Acuáticos (barco, lancha)) | ||
[[Archivo:Herencia.png]] | [[Archivo:Herencia.png]] | ||
*Es una forma de obtener características comunes por separado y luego especializar evitando redundancias | *Es una forma de obtener características comunes por separado y luego especializar evitando redundancias | ||
*Facilita la reusabilidad y adaptación | *Facilita la reusabilidad y adaptación | ||
+ | ;La herenica implica declarar jerarquía de clases | ||
+ | *En la raíz de la misma, establecemos la parte o estructura común a dichas clases , y posteriormente vamos especializando las diferencias de cada clase | ||
+ | [[Archivo:jerarquia_clases_1.png]] | ||
+ | |||
+ | {{MRM_Puntos clave| | ||
+ | :Todos los atributos y métodos de un supertipo o clase en nivel superior que sean públicos o '''''protegidos''''', son heredados (son parte de ella) a todas las clases de nivel inferior. | ||
+ | }} | ||
+ | *Para establecer una jerarquía, usamos la palabra reservada '''''extends''''' en las clases que hereden. | ||
+ | *Vamos a verlo con un ejemplo | ||
+ | [[Archivo:jerarquia_ambulatoria_1.png]] | ||
+ | *Primero establecemos la clase '''''Persona''''' | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | |||
+ | |||
+ | class Persona | ||
+ | { | ||
+ | protected $nombre; | ||
+ | protected $direccion; | ||
+ | protected $edad; | ||
+ | protected $frase; | ||
+ | |||
+ | public function __construct(string $n, string $d, string $e){ | ||
+ | |||
+ | } | ||
+ | |||
+ | public function establecer_frase ($frase){ | ||
+ | |||
+ | } | ||
+ | |||
+ | public function hablar ($frase){ | ||
+ | |||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | *Ahora establecemos la clase que hereda de persona | ||
+ | {{MRM_Puntos clave|Title=Principios del uso de la herencia| | ||
+ | ;Todos los atributos y métodos públicos y protegidos del supertipo '''''Persona''''' son también de '''''Sanitario''''' | ||
+ | ;En un momento dado, podemos invocar a los métodos del supertipo usando el operador '''''parent''''' seguido del operador de resolución de ámbito '''''::''''' | ||
+ | }} | ||
+ | *Observa el código | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | |||
+ | class Sanitario extends Persona | ||
+ | { | ||
+ | protected $centroSalud; | ||
+ | protected $yearTitulacion; | ||
+ | |||
+ | public function __construct(string $centro, string $year){ | ||
+ | parent::__construct(); | ||
+ | .... | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | </source> | ||
+ | |||
+ | |||
*Vemos dos ejemplos para explicar de forma empírica este concepto | *Vemos dos ejemplos para explicar de forma empírica este concepto | ||
{{MRM_Ejemplo|Title= Herencia: gestión personal ambulatorio| | {{MRM_Ejemplo|Title= Herencia: gestión personal ambulatorio| | ||
Línea 30: | Línea 94: | ||
*El digrama podría quedar | *El digrama podría quedar | ||
[[Imagen:JerarquiaPersonaAmbulatorio.png|center|400px]]<br /> | [[Imagen:JerarquiaPersonaAmbulatorio.png|center|400px]]<br /> | ||
+ | *Ver la aplicación ejecutándose | ||
+ | http://manuel.infenlaces.com/dwes/ejercicios/T6_Ambulatorio/ | ||
+ | {{Plegable|hide|Posible index de uso | | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | spl_autoload_register(function ($nombre_clase) { | ||
+ | include $nombre_clase . '.php'; | ||
+ | }); | ||
+ | |||
+ | $medico1 = new Medica("María", "Martínez", "Casa de María", 29, "Cardiólogía"); | ||
+ | $medico2 = new Medica("Luis", "Pérez", "Casa de Luis", 38, "Pediatría"); | ||
+ | $medico3 = new Medica("Nieves", "Ruiz", "Casa de Nieves", 44, "Dermatología"); | ||
+ | $conserje = new Conserje("Soledad", "Viruela", "Casa de Soledad", 58, "Mostrador Entrada"); | ||
+ | $enfermera = new Enfermera("Javier", "Moreno", "Casa de Javier", "general", 1990); | ||
+ | $enfermera2 = new Enfermera("Luis", "Perez", "Casa de Javier", "general", 1990); | ||
+ | |||
+ | |||
+ | $conserje->avisoEnfermera($enfermera, "Realizar cura en brazo Señor Martínez NSS 50/2155441/35"); | ||
+ | |||
+ | $enfermera->avisoMedico($medico3, "Paciente con toss y fiebre"); | ||
+ | |||
+ | $enfermera2->avisoMedico($medico2, "Paciente con toss y fiebre"); | ||
+ | $enfermera2->avisoMedico($medico2, "Paciente con Vómitos"); | ||
+ | $enfermera2->avisoMedico($medico3, "Paciente con pie torcido, impresión de rotura"); | ||
+ | |||
+ | |||
+ | $conserje->avisoMedico($medico1, "Visitar en casa con mucha fiebre", "Visita"); | ||
+ | $conserje->avisoMedico($medico1, "Problemas para desplazarse ", "Visita"); | ||
+ | $conserje->avisoMedico($medico2, "Mareos y vétigos", "Visita"); | ||
+ | $conserje->avisoMedico($medico2, "Persona mayor con poca mobilidad", "Visita"); | ||
+ | $conserje->avisoMedico($medico3, "Niño pequeño con fiebre", "Visita"); | ||
+ | $conserje->avisoMedico($medico1, "Caída en el parque", "Consulta"); | ||
+ | ?> | ||
+ | |||
+ | <html> | ||
+ | <head> | ||
+ | <meta charset="UTF-8"> | ||
+ | <title></title> | ||
+ | <style type="text/css"> | ||
+ | |||
+ | </style> | ||
+ | <link rel="stylesheet" href="./stilo.css" type="text/css"/> | ||
+ | </head> | ||
+ | <body> | ||
+ | <?php | ||
+ | echo "$medico3"; | ||
+ | echo "$medico1"; | ||
+ | echo "$medico2"; | ||
+ | // put your code here | ||
+ | ?> | ||
+ | </body> | ||
+ | </html> | ||
+ | </source> | ||
+ | |||
+ | }} | ||
+ | |||
+ | <!-- | ||
<font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploAmbulatorio | Posible Solución]]</font> | <font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploAmbulatorio | Posible Solución]]</font> | ||
+ | --> | ||
<hr /> | <hr /> | ||
}} | }} | ||
− | ==== | + | ====Clases Abstractas==== |
− | + | ||
*Cuando realizamos jerarquías muchas veces encontramos métodos comunes a varias clases. Esto implicaría que ese método sería un método de una superclase o clase padre de la que luego se heredará | *Cuando realizamos jerarquías muchas veces encontramos métodos comunes a varias clases. Esto implicaría que ese método sería un método de una superclase o clase padre de la que luego se heredará | ||
*Pero puede ocurrir que aunque el concepto del método es común a todas las clases,la forma de implementarla es particular en cada una de ellas. | *Pero puede ocurrir que aunque el concepto del método es común a todas las clases,la forma de implementarla es particular en cada una de ellas. | ||
+ | {{MRM_Ejemplo|Title=clase abstracta| | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | }} | ||
+ | |||
+ | |||
+ | |||
*En este caso, la forma correcta de proceder, es especificar el método el la clase superior, e implementar el código en cada una de las clases que derivo. | *En este caso, la forma correcta de proceder, es especificar el método el la clase superior, e implementar el código en cada una de las clases que derivo. | ||
*El método especificado en la clase superior sería un método sin código, conocido como un método abstracto, y la clase dónde se especifica pasa a ser abstracta | *El método especificado en la clase superior sería un método sin código, conocido como un método abstracto, y la clase dónde se especifica pasa a ser abstracta | ||
Línea 57: | Línea 187: | ||
#el número de lados. | #el número de lados. | ||
#calcular el área. | #calcular el área. | ||
− | # | + | #dibujar el polígono (Esto insertaremos un pequeño código de javascript de uso básico del canvas |
− | #conocer | + | #conocer el número de lados del polígono. |
− | *Realizamos los siguientes | + | [[Archivo:app_geometria.png]] |
− | + | *Realizamos los siguientes clases | |
− | + | ;Clase Polígono | |
− | + | <font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Poligono | Descripción de la Clase Polígono]]</font> | |
− | [[ | + | |
− | + | <hr /> | |
− | + | ;Clase Rectángulo | |
− | + | ||
− | < | + | |
+ | <font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Rectangulo | | ||
− | </ | + | Descripción de la Clase Rectángulo]]</font> |
− | + | <hr /> | |
− | + | ;Clase Cuadrado | |
− | + | ||
− | = | + | <font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Cuadrado | |
− | < | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
+ | Descripción de la Clase Cuadrado]]</font> | ||
+ | <hr /> | ||
+ | ;Clase Triangulo | ||
− | |||
+ | <font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Triangulo | | ||
− | + | Descripción de la Clase Triángulo]]</font> | |
− | + | <hr /> | |
+ | ;Uso de esta aplicación | ||
+ | *Un posible código index.php que lo único que hace es crear objetos y visulizar su área y dibujarlos | ||
+ | <source lang=php> | ||
− | <! | + | <!DOCTYPE html> |
− | = | + | <html> |
− | + | <head> | |
− | + | <meta charset="UTF-8"> | |
− | === | + | <title></title> |
− | + | </head> | |
− | + | <body> | |
− | + | <?php | |
− | + | spl_autoload_register(function ($clase){ | |
− | + | require "$clase.php"; | |
− | --> | + | }); |
+ | |||
+ | $triangulo = new Triangulo(200,300); | ||
+ | $cuadrado = new Cuadrado(200); | ||
+ | $rectangulo = new Rectangulo(200,100); | ||
+ | |||
+ | echo "<h4>Triángulo, ". Poligono::lados($triangulo)." y área ". | ||
+ | $triangulo->area()." px<sup>2</sup></h4>"; | ||
+ | |||
+ | echo "<h4>Cuadrado, ". Poligono::lados($cuadrado)." y área ". | ||
+ | $cuadrado->area()." px<sup>2</sup></h4>"; | ||
+ | echo "<h4>Rectángulo, ". Poligono::lados($rectangulo)." y área ". | ||
+ | $rectangulo->area()." px<sup>2</sup></h4>"; | ||
+ | |||
+ | echo $triangulo->dibuja(); | ||
+ | echo $cuadrado->dibuja(); | ||
+ | echo $rectangulo->dibuja(); | ||
+ | |||
+ | |||
+ | ?> | ||
+ | </body> | ||
+ | </html> | ||
+ | </source> | ||
+ | ;Resultado de su ejecución | ||
+ | [[Archivo:AppGeometria.png]] | ||
+ | }} | ||
+ | V |
Última revisión de 17:26 23 may 2023
Herencia
- La herencia es un mecanismo de programación que me permite crear una jerarquía en los componentes software, que se pueden ir especializando
- Es principio de abstracción por el cual podemos crear una jerarquía de clases, donde tenemos la raíz con los elementos comunes y en los nodos vamos especializando clases.
- La idea es definir una clase con ciertas características comunes (atributos, métodos)
Posteriormente crearemos otras clases a partir de la ya existente, quedando implícitamente los atributos y métodos como también parte de su estructura o composición.
- Es una característica muy natural (p.e Personas (médicos y bailarines) vehículos (Terrestres (coche, moto) Acuáticos (barco, lancha))
- Es una forma de obtener características comunes por separado y luego especializar evitando redundancias
- Facilita la reusabilidad y adaptación
- La herenica implica declarar jerarquía de clases
- En la raíz de la misma, establecemos la parte o estructura común a dichas clases , y posteriormente vamos especializando las diferencias de cada clase
|
- Para establecer una jerarquía, usamos la palabra reservada extends en las clases que hereden.
- Vamos a verlo con un ejemplo
- Primero establecemos la clase Persona
<?php class Persona { protected $nombre; protected $direccion; protected $edad; protected $frase; public function __construct(string $n, string $d, string $e){ } public function establecer_frase ($frase){ } public function hablar ($frase){ } }
- Ahora establecemos la clase que hereda de persona
|
- Observa el código
<?php class Sanitario extends Persona { protected $centroSalud; protected $yearTitulacion; public function __construct(string $centro, string $year){ parent::__construct(); .... }
- Vemos dos ejemplos para explicar de forma empírica este concepto
Herencia: gestión personal ambulatorio
| |||
Las propiedades (atributos) y métodos de cada clase se especifican en los siguientes diagramas de clases
http://manuel.infenlaces.com/dwes/ejercicios/T6_Ambulatorio/
|
Clases Abstractas
- Cuando realizamos jerarquías muchas veces encontramos métodos comunes a varias clases. Esto implicaría que ese método sería un método de una superclase o clase padre de la que luego se heredará
- Pero puede ocurrir que aunque el concepto del método es común a todas las clases,la forma de implementarla es particular en cada una de ellas.
- En este caso, la forma correcta de proceder, es especificar el método el la clase superior, e implementar el código en cada una de las clases que derivo.
- El método especificado en la clase superior sería un método sin código, conocido como un método abstracto, y la clase dónde se especifica pasa a ser abstracta
|
|
- Vamos a platear un ejemplo
App de Geometría
| |
Descripción de la Clase Polígono
Descripción de la Clase Rectángulo
Descripción de la Clase Cuadrado
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <?php spl_autoload_register(function ($clase){ require "$clase.php"; }); $triangulo = new Triangulo(200,300); $cuadrado = new Cuadrado(200); $rectangulo = new Rectangulo(200,100); echo "<h4>Triángulo, ". Poligono::lados($triangulo)." y área ". $triangulo->area()." px<sup>2</sup></h4>"; echo "<h4>Cuadrado, ". Poligono::lados($cuadrado)." y área ". $cuadrado->area()." px<sup>2</sup></h4>"; echo "<h4>Rectángulo, ". Poligono::lados($rectangulo)." y área ". $rectangulo->area()." px<sup>2</sup></h4>"; echo $triangulo->dibuja(); echo $cuadrado->dibuja(); echo $rectangulo->dibuja(); ?> </body> </html>
|
V