Diferencia entre revisiones de «Plantilla:PHP/Herencia»

De WikiEducator
Saltar a: navegación, buscar
 
(24 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
====Métodos ''static'' Vs ''no static''====
+
<div id=parrafo>
*En php la idea de '''''static''''', es igual que en cualquier lenguaje de programación.
+
=== Herencia ===
*Cuando un elementos  (atributo o método), es estático, ese elemento es compartido por todos los objetos de la clase, y persiste en memoria con su contenido mientras haya un objeto de esa clase.
+
* La herencia es un mecanismo de programación que permite crear una jerarquía en los componentes ''software'', que se van especializando.
*Como no es un elemento de cada objeto, sino de todos los objetos de una clase, también se le suelen llamar atributos o métodos de la clase.
+
* Es un principio de abstracción mediante el cual podemos crear una jerarquía de clases, con una raíz que contiene los elementos comunes y nodos que representan clases especializadas.
*Como no es de la clase para acceder a él necesitamos nombrar la clase. En php se puede hacer suando el operador '''''self''''' o incluso el propio nombre de la clase
+
* La idea es definir una clase con ciertas características comunes (atributos, métodos). Posteriormente, crearemos otras clases a partir de la ya existente, heredando implícitamente los atributos y métodos como parte de su estructura o composición.
  
*Es un ejemplo típico tener un atributo static que cuente cuantos objetos hay de una clase.
+
* Es una característica muy natural. Por ejemplo: 
*Miramos la siguiente imagen que trata de ilustrar como al crear objetos se instancian en memoria
+
  - Personas → (Médicos, Bailarines)  
[[Archivo:estatico1.png]]
+
  - Vehículos → (Terrestres → Coche, Moto) / (Acuáticos → Barco, Lancha) 
*Cuando añadimos un elemento estático, solo habrá una copia en memoria y es compartida por todos los objetos de la clase
+
 
[[Archivo:estatico2.png]]
+
[[Archivo:Herencia.png]]
*Vemos el código y como se accede al elemento
+
 
 +
* La herencia es una forma de obtener características comunes por separado y luego especializarlas, evitando redundancias. 
 +
* Facilita la reutilización y la adaptación del código.
 +
 
 +
;La herencia implica declarar jerarquías de clases
 +
* En la raíz de la jerarquía establecemos la parte o estructura común a todas las clases, y posteriormente vamos especializando las diferencias de cada una.
 +
[[Archivo:jerarquia_clases_1.png]]
 +
 
 +
{{MRM_Puntos clave|
 +
:Todos los atributos y métodos de una clase superior (supertipo) que sean públicos o '''protegidos''' son heredados por todas las clases derivadas (subtipos).
 +
}}
 +
 
 +
* Para establecer una jerarquía, usamos la palabra reservada '''extends''' en las clases que heredan. 
 +
* Vamos a verlo con un ejemplo:
 +
[[Archivo:jerarquia_ambulatoria_1.png]]
 +
 
 +
* Primero establecemos la clase '''Persona''':
  
 
<source lang=php>
 
<source lang=php>
 
<?php
 
<?php
class Racional {
+
class Persona {
      
+
     protected $nombre;
     static public $cuenta_racionales=0;
+
    protected $direccion;
 +
    protected $edad;
 +
     protected $frase;
  
    //atributos
+
     public function __construct(string $n, string $d, int $e){
    private $num; //el numerador
+
         $this->nombre = $n;
    private $den; //el denominador
+
        $this->direccion = $d;
    //......
+
        $this->edad = $e;
     public function __construct($num, $den) {
+
     }
         self::$cuenta_racionales++;
+
     .......
+
  
</source>
+
    public function establecer_frase(string $frase){
*El uso
+
        $this->frase = $frase;
<source lang = php>
+
    }
<?php
+
  
/*
+
     public function hablar(){
* To change this license header, choose License Headers in Project Properties.
+
        echo $this->frase;
* To change this template file, choose Tools | Templates
+
     }
* and open the template in the editor.
+
}
*/
+
require_once "Racional.php";
+
      
+
   
+
    $r1 = new Racional(5,4);
+
    $r2 = new Racional(5,4);
+
    $r3 = new Racional(5,4);
+
    echo "<h1>Ahora tenemos ". Racional ::$cuenta_racionales." objetos racionales</h1>";
+
     $r4 = new Racional(5,4);
+
    $r5 = new Racional(5,4);
+
    echo "<h1>Ahora tenemos" .Racional::$cuenta_racionales."</h1>";
+
    $r6 = new Racional(5,4);
+
    $r7 = new Racional(5,4);
+
   
+
    //Observa (y esto es de php ) que puedo acceder a un elemento estático
+
    //A traves del nombre del objeto
+
    echo "<h1>Ahora tenemos" .Racional::$cuenta_racionales."</h1>";
+
    echo "<h1>Podemos acceder con los objtetos </h2>";
+
    echo "<h1>Según r1 tenemos " .$r1::$cuenta_racionales."</h1>";
+
    echo "<h1>Según r2 tenemos " .$r2::$cuenta_racionales."</h1>";
+
    echo "<h1>Según r3 tenemos " .$r3::$cuenta_racionales."</h1>";
+
    echo "<h1>Según r4 tenemos " .$r4::$cuenta_racionales."</h1>";
+
    echo "<h1>Según La clase tenemos " .Racional::$cuenta_racionales."</h1>";
+
   
+
   
+
   
+
   
+
 
?>
 
?>
 
</source>
 
</source>
*La salida
 
[[Archivo:AppEstatica1.png]]
 
  
*Vamos a implementar las operaciones en un Racional.
+
* Ahora establecemos la clase que hereda de Persona:
Primero como siempre conviene recordar cómo se hacen
+
 
[[Archivo:suma_racionales.png]]
+
{{MRM_Puntos clave|Title=Principios del uso de la herencia|
[[Archivo:resta_racionales.png]]
+
;Todos los atributos y métodos públicos y protegidos del supertipo '''Persona''' son también de '''Sanitario'''.
[[Archivo:mult_racionales.png]]
+
;En un momento dado, podemos invocar métodos del supertipo usando el operador '''parent''' junto con el operador de resolución de ámbito '''::'''.
[[Archivo:div_racionales.png]]
+
}}
*Si la operación la implemento como  un método no estático lo que estaría haciendo es sumar al objeto acutual, otro objeto Racional que pasamos como argumento. Puedo modificar el objeto acutal como resultado de la suma, o devolver otro objeto Racional que sería lo mas correcto
+
 
 
<source lang=php>
 
<source lang=php>
/**
+
<?php
    *
+
class Sanitario extends Persona {
    * @param Racional $n1
+
     protected $centroSalud;
    * @return \Racional
+
    protected $yearTitulacion;
    * @description suma al racional actual, el racional que recibe como parámetro
+
    */
+
     public function sumar(Racional $n1) {
+
        $den = ($this->den * $n1->getDen());
+
        $num = ($this->den * $n1->getNum() + $this->num * $n1->getDen());
+
  
         return new Racional($num, $den);
+
    public function __construct(string $n, string $d, int $e, string $centro, int $year) {
 +
         parent::__construct($n, $d, $e);
 +
        $this->centroSalud = $centro;
 +
        $this->yearTitulacion = $year;
 
     }
 
     }
</source>
 
*Para usarlo
 
<source lang=php>
 
....
 
$r1 = new Racional(7,6);
 
$r2 = new Racional(9,4);
 
 
 
  
$r3  = $r1->sumar($r2)
+
    public function mostrarInfo(){
echo "$r1 + $r2 = $r3);
+
        echo "$this->nombre trabaja en $this->centroSalud y obtuvo su título en $this->yearTitulacion.";
 +
    }
 +
}
 +
?>
 
</source>
 
</source>
*La salida
 
[[Archivo:sumarNoEstatico.png]]
 
  
*Si la operación la realizo como  un método estático lo que estaría haciendo es sumar dos objetos Racionales , devolviendo un nuevo objeto de tipo Racional Vamos
+
---
<source lang=php>
+
    static public function sum_static (Racional $r1, Racional $r2){
+
        $n = $r1->getNum()*$r2->getDen()+$r1->getDen()*$r2->getNum();
+
        $d = $r1->getDen()*$r2->getDen();
+
        return new Racional ($n, $d);
+
</source>
+
  
*Para usarlo
+
* Vemos dos ejemplos para explicar de forma práctica este concepto.
 +
 
 +
{{MRM_Ejemplo|Title=Herencia: gestión de personal en un ambulatorio|
 +
* Se pide gestionar un ambulatorio. 
 +
* Para ello haremos solo el diagrama de clases y su implementación a nivel básico (sin entrar en detalles). 
 +
* Tras realizar el análisis, se determina que se pretende gestionar los datos de los empleados y anotar las acciones básicas que realizan. 
 +
 
 +
;Encontramos los siguientes elementos, que especificamos como clases:
 +
* Conserjes 
 +
* Enfermeras 
 +
* Médicas 
 +
 
 +
Las propiedades (atributos) y métodos de cada clase se representan en los siguientes diagramas:
 +
<gallery>
 +
Image:claseConserje.png|Clase Conserje
 +
Image:claseEnfermera.png|Clase Enfermera
 +
Image:claseMedica.png|Clase Médica
 +
</gallery>
 +
 
 +
* Claramente vemos que todos ellos comparten varios elementos comunes. 
 +
* Esto nos permite crear una clase genérica, por ejemplo '''personalAmbulatorio'''. 
 +
* Posteriormente crearemos especializaciones de esta clase con los elementos particulares. 
 +
 
 +
El diagrama podría quedar así:
 +
[[Archivo: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>
 
<source lang=php>
....
+
<?php
$r1 = new Racional(7,6);
+
spl_autoload_register(function ($nombre_clase) {
$r2 = new Racional(9,4);
+
    include $nombre_clase . '.php';
 
+
});
  
$r3  = Racional::sum_static($r1,$r2);
+
$medico1 = new Medica("María", "Martínez", "Casa de María", 29, "Cardiología");
echo "$r1 + $r2 = $r3);
+
$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");
 +
$enfermera1 = new Enfermera("Javier", "Moreno", "Casa de Javier", "General", 1990);
 +
$enfermera2 = new Enfermera("Luis", "Pérez", "Casa de Javier", "General", 1990);
 +
 
 +
$conserje->avisoEnfermera($enfermera1, "Realizar cura en brazo del Sr. Martínez NSS 50/2155441/35");
 +
$enfermera1->avisoMedico($medico3, "Paciente con tos y fiebre");
 +
 
 +
$enfermera2->avisoMedico($medico2, "Paciente con fiebre y vómitos");
 +
$enfermera2->avisoMedico($medico3, "Paciente con pie torcido; posible fractura");
 +
 
 +
$conserje->avisoMedico($medico1, "Visitar en casa por fiebre alta", "Visita");
 +
$conserje->avisoMedico($medico2, "Persona mayor con poca movilidad", "Visita");
 +
$conserje->avisoMedico($medico3, "Niño pequeño con fiebre", "Consulta");
 +
?>
 +
<html>
 +
<head>
 +
    <meta charset="UTF-8">
 +
    <title>Gestión Ambulatorio</title>
 +
    <link rel="stylesheet" href="./stilo.css" type="text/css"/>
 +
</head>
 +
<body>
 +
    <?php
 +
    echo $medico3;
 +
    echo $medico1;
 +
    echo $medico2;
 +
    ?>
 +
</body>
 +
</html>
 
</source>
 
</source>
*La salida
+
}}
 +
<hr />
 +
}}
  
 +
==== Clases Abstractas ====
 +
* Cuando realizamos jerarquías, muchas veces encontramos métodos comunes a varias clases. 
 +
Esto implicaría que ese método debería pertenecer a una superclase (o clase padre), de la que luego se heredará. 
 +
* Pero puede ocurrir que, aunque el concepto del método sea común a todas las clases, la forma de implementarlo sea diferente en cada una.
  
 +
{{MRM_Ejemplo|Title=Clase abstracta|
 +
* Ejemplo ilustrativo:
 +
[[Archivo:claseAbstracta.png]]
 +
}}
  
 +
* En este caso, la forma correcta de proceder es especificar el método en la clase superior y dejar su implementación a las clases derivadas. 
 +
* El método especificado en la clase superior será un método sin código, conocido como '''método abstracto''', y la clase donde se define pasa a ser una '''clase abstracta'''.
  
===Herencia===
+
{{MRM_Definicion|Title=Clase abstracta|
*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 aquella clase que tiene uno o más métodos abstractos.
Se puede definir una clase  con ciertas características (atributos, métodos)
+
*Posteriormente puedo definir otra clase a partir de la ya existente, quedándo 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))
+
[[Archivo:Herencia.png]]
+
*Es una forma de obtener características comunes por separado y luego especializar evitando redundancias
+
*Facilita la reusabilidad y adaptación
+
*Vemos dos ejemplos  para explicar de forma empírica este concepto
+
{{MRM_Ejemplo|Title= Herencia: gestión personal ambulatorio|
+
*Se pide gestionar un ambulatorio.
+
*Para ello vamos a hacer sólo el diagrama de clases y su implementación.
+
*Lo hacemos a nivel básico (sin entrar en detalles).
+
*Tras realizar un análisis se determina que se pretende gestionar:
+
;los datos de los empleados y anotar las acciones básicas que realizan.
+
*Encontramos los siguientes elementos que especificamos como clases
+
;Conserjes
+
;Enfermeras
+
;Médicas
+
Las propiedades (atributos) y métodos de cada clase se especifican
+
en los siguientes diagramas de clases
+
<gallery>
+
Image:claseConserje.png|Clase Conserje
+
Image:claseEnfermera.png|Clase Enfermera
+
Image:claseMedica.png|Clase Medicas
+
</gallery>
+
*Claramente vemos que todos ellos tienen varios elementos en común.
+
*Esto nos permite crear una clases genérica que por ejemplo podemos llamar '''''personalAmbulatorio'''''
+
*Posteriormente creamos una especialización de '''''personalAmbulatorio''''' con los elementos particulares
+
*El digrama podría quedar
+
[[Imagen:JerarquiaPersonaAmbulatorio.png|center|400px]]<br />
+
<font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploAmbulatorio | Posible Solución]]</font>
+
<hr />
+
 
}}
 
}}
====clases abstractas====
+
 
*Es una situación particular que se presentan en muchas jerarquías
+
{{MRM_Definicion|Title=Método abstracto|
*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á
+
* Es un método que no tiene código asociado
*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.
+
* Su implementación se realizará en las clases derivadas.
*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
+
{{MRM_Definicion|Title= Clase Abstracta|
+
Es aquella clase que tiene un método o más abstracto}}
+
{{MRM_Definicion|Title=Método Abstracto|
+
*Es un método que no tiene código asociado
+
*El código se implementará en las clases derivadas
+
 
}}
 
}}
 +
 
{{MRM_Puntos clave|
 
{{MRM_Puntos clave|
;Nunca podremos instanciar un objeto de una clase abstracta
+
;Nunca podremos instanciar un objeto de una clase abstracta.
*Esto es normal, ya que ese objeto no tendría instrucciones para su/s método/s abstracto/s
+
* Esto es lógico, ya que ese objeto no tendría instrucciones para ejecutar sus métodos abstractos.
 
}}
 
}}
  
*Vamos a platear un ejemplo  
+
* Vamos a plantear un ejemplo práctico:
  
 
{{MRM_Ejemplo|Title=App de Geometría|
 
{{MRM_Ejemplo|Title=App de Geometría|
;Gestionar figuras geométricas de tipo triángulo, cuadrado y Rectángulo.
+
;Gestionar figuras geométricas de tipo triángulo, cuadrado y rectángulo.
*De ellas queremos conocer:
+
* De ellas queremos conocer:
#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
+
# Dibujar el polígono (usaremos un pequeño código JavaScript para el ''canvas''). 
#conocer el número de lados del polígono.
+
# Conocer el número de lados del polígono.
*Realizamos los siguientes clases  
+
 
;Clase Polígono
+
[[Archivo:app_geometria.png]]
<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>
+
 
 +
* Definimos las siguientes clases
 +
 
 +
;Clase Polígono
 +
<font size=5 color=red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Poligono | Descripción de la Clase Polígono]]</font>
 +
 
 
<hr />
 
<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>
+
;Clase Rectángulo
 +
<font size=5 color=red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Rectangulo | Descripción de la Clase Rectángulo]]</font>
 +
 
 
<hr />
 
<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>
+
;Clase Cuadrado
 +
<font size=5 color=red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Cuadrado | Descripción de la Clase Cuadrado]]</font>
 +
 
 
<hr />
 
<hr />
  
;Clase Triangulo
+
;Clase Triángulo 
<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>
+
<font size=5 color=red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Triangulo | Descripción de la Clase Triángulo]]</font>
 +
 
 
<hr />
 
<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>
 
  
 +
;Uso de esta aplicación 
 +
* Un posible archivo '''index.php''' que crea los objetos, calcula sus áreas y los dibuja:
 +
 +
<source lang=php>
 
<!DOCTYPE html>
 
<!DOCTYPE html>
 
<html>
 
<html>
    <head>
+
<head>
        <meta charset="UTF-8">
+
    <meta charset="UTF-8">
        <title></title>
+
    <title>App Geometría</title>
    </head>
+
</head>
    <body>
+
<body>
        <?php
+
<?php
        spl_autoload_register(function ($clase){
+
spl_autoload_register(function ($clase){
            require "$clase.php";
+
    require "$clase.php";
        });
+
});
       
+
 
        $triangulo = new Triangulo(200,300);
+
$triangulo = new Triangulo(200, 300);
        $cuadrado = new Cuadrado(200);
+
$cuadrado = new Cuadrado(200);
        $rectangulo = new Rectangulo(200,100);
+
$rectangulo = new Rectangulo(200, 100);
       
+
 
        echo "<h4>Triángulo, ". Poligono::lados($triangulo)." y área ".
+
echo "<h4>Triángulo, " . Poligono::lados($triangulo) .
                $triangulo->area()." px<sup>2</sup></h4>";
+
    " lados, área: " . $triangulo->area() . " px<sup>2</sup></h4>";
     
+
 
        echo "<h4>Cuadrado, ". Poligono::lados($cuadrado)." y área ".
+
echo "<h4>Cuadrado, " . Poligono::lados($cuadrado) .
                $cuadrado->area()." px<sup>2</sup></h4>";
+
    " lados, á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 "<h4>Rectángulo, " . Poligono::lados($rectangulo) .
       
+
    " lados, área: " . $rectangulo->area() . " px<sup>2</sup></h4>";
        echo $triangulo->dibuja();
+
 
        echo $cuadrado->dibuja();
+
echo $triangulo->dibuja();
        echo $rectangulo->dibuja();
+
echo $cuadrado->dibuja();
     
+
echo $rectangulo->dibuja();
       
+
?>
        ?>
+
</body>
    </body>
+
 
</html>
 
</html>
 
</source>
 
</source>
;Resultado de su ejecución
+
 
 +
;Resultado de su ejecución
 
[[Archivo:AppGeometria.png]]
 
[[Archivo:AppGeometria.png]]
 
}}
 
}}
V
+
</div>

Última revisión de 05:51 7 nov 2025

Herencia

  • La herencia es un mecanismo de programación que permite crear una jerarquía en los componentes software, que se van especializando.
  • Es un principio de abstracción mediante el cual podemos crear una jerarquía de clases, con una raíz que contiene los elementos comunes y nodos que representan clases especializadas.
  • La idea es definir una clase con ciertas características comunes (atributos, métodos). Posteriormente, crearemos otras clases a partir de la ya existente, heredando implícitamente los atributos y métodos como parte de su estructura o composición.
  • Es una característica muy natural. Por ejemplo:
 - Personas → (Médicos, Bailarines)  
 - Vehículos → (Terrestres → Coche, Moto) / (Acuáticos → Barco, Lancha)  

Herencia.png

  • La herencia es una forma de obtener características comunes por separado y luego especializarlas, evitando redundancias.
  • Facilita la reutilización y la adaptación del código.
La herencia implica declarar jerarquías de clases
  • En la raíz de la jerarquía establecemos la parte o estructura común a todas las clases, y posteriormente vamos especializando las diferencias de cada una.

Jerarquia clases 1.png



Icon key points.gif

Puntos clave

Todos los atributos y métodos de una clase superior (supertipo) que sean públicos o protegidos son heredados por todas las clases derivadas (subtipos).



  • Para establecer una jerarquía, usamos la palabra reservada extends en las clases que heredan.
  • Vamos a verlo con un ejemplo:

Jerarquia ambulatoria 1.png

  • Primero establecemos la clase Persona:
<?php
class Persona {
    protected $nombre;
    protected $direccion;
    protected $edad;
    protected $frase;
 
    public function __construct(string $n, string $d, int $e){
        $this->nombre = $n;
        $this->direccion = $d;
        $this->edad = $e;
    }
 
    public function establecer_frase(string $frase){
        $this->frase = $frase;
    }
 
    public function hablar(){
        echo $this->frase;
    }
}
?>
  • Ahora establecemos la clase que hereda de Persona:



Icon key points.gif

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 métodos del supertipo usando el operador parent junto con el operador de resolución de ámbito ::.



<?php
class Sanitario extends Persona {
    protected $centroSalud;
    protected $yearTitulacion;
 
    public function __construct(string $n, string $d, int $e, string $centro, int $year) {
        parent::__construct($n, $d, $e);
        $this->centroSalud = $centro;
        $this->yearTitulacion = $year;
    }
 
    public function mostrarInfo(){
        echo "$this->nombre trabaja en $this->centroSalud y obtuvo su título en $this->yearTitulacion.";
    }
}
?>

---

  • Vemos dos ejemplos para explicar de forma práctica este concepto.



Icon casestudy.gif
Herencia: gestión de personal en un ambulatorio
  • Se pide gestionar un ambulatorio.
  • Para ello haremos solo el diagrama de clases y su implementación a nivel básico (sin entrar en detalles).
  • Tras realizar el análisis, se determina que se pretende gestionar los datos de los empleados y anotar las acciones básicas que realizan.
Encontramos los siguientes elementos, que especificamos como clases
  • Conserjes
  • Enfermeras
  • Médicas

Las propiedades (atributos) y métodos de cada clase se representan en los siguientes diagramas:

  • Claramente vemos que todos ellos comparten varios elementos comunes.
  • Esto nos permite crear una clase genérica, por ejemplo personalAmbulatorio.
  • Posteriormente crearemos especializaciones de esta clase con los elementos particulares.

El diagrama podría quedar así:

JerarquiaPersonaAmbulatorio.png


  • Ver la aplicación ejecutándose:

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 debería pertenecer a una superclase (o clase padre), de la que luego se heredará.

  • Pero puede ocurrir que, aunque el concepto del método sea común a todas las clases, la forma de implementarlo sea diferente en cada una.



Icon casestudy.gif
Clase abstracta
  • Ejemplo ilustrativo:

Archivo:ClaseAbstracta.png



  • En este caso, la forma correcta de proceder es especificar el método en la clase superior y dejar su implementación a las clases derivadas.
  • El método especificado en la clase superior será un método sin código, conocido como método abstracto, y la clase donde se define pasa a ser una clase abstracta.



Icon define.gif
Clase abstracta
  • Es aquella clase que tiene uno o más métodos abstractos.




Icon define.gif
Método abstracto
  • Es un método que no tiene código asociado.
  • Su implementación se realizará en las clases derivadas.




Icon key points.gif

Puntos clave

Nunca podremos instanciar un objeto de una clase abstracta.
  • Esto es lógico, ya que ese objeto no tendría instrucciones para ejecutar sus métodos abstractos.



  • Vamos a plantear un ejemplo práctico:



Icon casestudy.gif
App de Geometría
{{{1}}}