Diferencia entre revisiones de «Plantilla:PHP/Herencia»

De WikiEducator
Saltar a: navegación, buscar
 
(15 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 +
<div id=parrafo>
 +
=== 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) 
  
 +
[[Archivo: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.
  
===Herencia===
+
;La herencia implica declarar jerarquías de clases
*La herencia es un mecanismo de programación que me permite crear una jerarquía en los componentes software, que se pueden ir especializando
+
* 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.
Se puede definir una clase  con ciertas características (atributos, métodos)
+
[[Archivo:jerarquia_clases_1.png]]
*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))
+
{{MRM_Puntos clave|
[[Archivo:Herencia.png]]
+
: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).
*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
+
* Para establecer una jerarquía, usamos la palabra reservada '''extends''' en las clases que heredan.  
{{MRM_Ejemplo|Title= Herencia: gestión personal ambulatorio|
+
* Vamos a verlo con un ejemplo:
*Se pide gestionar un ambulatorio.
+
[[Archivo:jerarquia_ambulatoria_1.png]]
*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).
+
* Primero establecemos la clase '''Persona''':
*Tras realizar un análisis se determina que se pretende gestionar:
+
 
;los datos de los empleados y anotar las acciones básicas que realizan.
+
<source lang=php>
*Encontramos los siguientes elementos que especificamos como clases
+
<?php
;Conserjes
+
class Persona {
;Enfermeras
+
    protected $nombre;
;Médicas
+
    protected $direccion;
  Las propiedades (atributos) y métodos de cada clase se especifican
+
    protected $edad;
en los siguientes diagramas de clases
+
    protected $frase;
<gallery>
+
 
Image:claseConserje.png|Clase Conserje  
+
    public function __construct(string $n, string $d, int $e){
Image:claseEnfermera.png|Clase Enfermera
+
        $this->nombre = $n;
Image:claseMedica.png|Clase Medicas
+
        $this->direccion = $d;
</gallery>
+
        $this->edad = $e;
*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
+
    public function establecer_frase(string $frase){
*El digrama podría quedar
+
        $this->frase = $frase;
[[Imagen:JerarquiaPersonaAmbulatorio.png|center|400px]]<br />
+
    }
*Ver la aplicación ejecutándose
+
 
  http://manuel.infenlaces.com/web/T4_Ambulatorio/
+
    public function hablar(){
{{Plegable|hide|Posible index de uso |
+
        echo $this->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 métodos del supertipo usando el operador '''parent''' junto con el operador de resolución de ámbito '''::'''.
 +
}}
 +
 
 +
<source lang=php>
 +
<?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.";
 +
    }
 +
}
 +
?>
 +
</source>
 +
 
 +
---
 +
 
 +
* 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
 
<?php
Línea 43: Línea 118:
 
});
 
});
  
$medico1 = new Medica("María", "Martínez", "Casa de María", 29, "Cardiólogía");
+
$medico1 = new Medica("María", "Martínez", "Casa de María", 29, "Cardiología");
 
$medico2 = new Medica("Luis", "Pérez", "Casa de Luis", 38, "Pediatría");
 
$medico2 = new Medica("Luis", "Pérez", "Casa de Luis", 38, "Pediatría");
 
$medico3 = new Medica("Nieves", "Ruiz", "Casa de Nieves", 44, "Dermatología");
 
$medico3 = new Medica("Nieves", "Ruiz", "Casa de Nieves", 44, "Dermatología");
 
$conserje = new Conserje("Soledad", "Viruela", "Casa de Soledad", 58, "Mostrador Entrada");
 
$conserje = new Conserje("Soledad", "Viruela", "Casa de Soledad", 58, "Mostrador Entrada");
$enfermera = new Enfermera("Javier", "Moreno", "Casa de Javier", "general", 1990);
+
$enfermera1 = new Enfermera("Javier", "Moreno", "Casa de Javier", "General", 1990);
$enfermera2 = new Enfermera("Luis", "Perez", "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");
  
$conserje->avisoEnfermera($enfermera, "Realizar cura en brazo Señor Martínez NSS 50/2155441/35");
+
$enfermera2->avisoMedico($medico2, "Paciente con fiebre y vómitos");
 +
$enfermera2->avisoMedico($medico3, "Paciente con pie torcido; posible fractura");
  
$enfermera->avisoMedico($medico3, "Paciente con toss y fiebre");
+
$conserje->avisoMedico($medico1, "Visitar en casa por fiebre alta", "Visita");
 
+
$conserje->avisoMedico($medico2, "Persona mayor con poca movilidad", "Visita");
$enfermera2->avisoMedico($medico2, "Paciente con toss y fiebre");
+
$conserje->avisoMedico($medico3, "Niño pequeño con fiebre", "Consulta");
$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>
 
<html>
    <head>
+
<head>
        <meta charset="UTF-8">
+
    <meta charset="UTF-8">
        <title></title>
+
    <title>Gestión Ambulatorio</title>
        <style type="text/css">
+
    <link rel="stylesheet" href="./stilo.css" type="text/css"/>
 
+
</head>
        </style>
+
<body>
        <link rel="stylesheet" href="./stilo.css" type="text/css"/>
+
    <?php
    </head>
+
    echo $medico3;
    <body>
+
    echo $medico1;
        <?php
+
    echo $medico2;
        echo "$medico3";
+
    ?>
        echo "$medico1";
+
</body>
        echo "$medico2";
+
// put your code here
+
        ?>
+
    </body>
+
 
</html>
 
</html>
 
</source>
 
</source>
 +
}}
 +
<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. 
<font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploAmbulatorio | Posible Solución]]</font>
+
* 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'''.
-->
+
 
<hr />
+
{{MRM_Definicion|Title=Clase abstracta|
 +
* Es aquella clase que tiene uno o más métodos abstractos.
 
}}
 
}}
====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.
 +
 
 
[[Archivo:app_geometria.png]]
 
[[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 |
+
* Definimos las siguientes clases:
  
Descripción de la Clase Rectángulo]]</font>
+
;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 Cuadrado
 
  
<font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Cuadrado |  
+
;Clase Rectángulo 
 +
<font size=5 color=red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Rectangulo | Descripción de la Clase Rectángulo]]</font>
  
Descripción de la Clase Cuadrado]]</font>
 
 
<hr />
 
<hr />
  
;Clase Triangulo
+
;Clase Cuadrado 
 +
<font size=5 color=red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Cuadrado | Descripción de la Clase Cuadrado]]</font>
  
 +
<hr />
  
<font size<nowiki>=</nowiki>5 color<nowiki>=</nowiki>red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Triangulo |  
+
;Clase Triángulo 
 +
<font size=5 color=red>[[Usuario:ManuelRomero/ProgramacionWeb/php/POO/Herencia/EjemploGeometria/Triangulo | Descripción de la Clase Triángulo]]</font>
  
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}}}