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
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))
- 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, y posteriormente vamos especializando en las difenrentes
Plantilla:MRM Puntos Clave
- Vemos dos ejemplos para explicar de forma empírica este concepto
|
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
- 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
- Ver la aplicación ejecutándose
http://manuel.infenlaces.com/dwes/ejercicios/T6_Ambulatorio/
Posible index de uso |
---|
<?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>
|
|
clases abstractas
- Es una situación particular que se presentan en muchas jerarquías
- 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
Clase Abstracta
Es aquella clase que tiene un método o más abstracto
|
Método Abstracto
- Es un método que no tiene código asociado
- El código se implementará en las clases derivadas
|
- 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
|
- Vamos a platear un ejemplo
|
App de Geometría
|
|
- Gestionar figuras geométricas de tipo triángulo, cuadrado y Rectángulo.
- De ellas queremos conocer:
- el número de lados.
- calcular el área.
- dibujar el polígono (Esto insertaremos un pequeño código de javascript de uso básico del canvas
- conocer el número de lados del polígono.
- Realizamos los siguientes clases
- Clase Polígono
Descripción de la Clase Polígono
- Clase Rectángulo
Descripción de la Clase Rectángulo
- Clase Cuadrado
Descripción de la Clase Cuadrado
- Clase Triangulo
Descripción de la Clase Triángulo
- 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
<!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>
- Resultado de su ejecución
|
V