<p>En esta publicación hablaré de las Clase Abstractas y de las Interfaces, usaremos el ejemplo de las figuras geométricas expuesto en la publicación anterior.</p> <h2>Clase Abstracta</h2> <p>En la <a href="Diseno-Orientado-a-Objetos-Unidad-I">Unidad I</a> expliqué que una clase era un concepto o plantilla y que esta al ser instanciada se transformaba en un objeto en memoria, una <em><strong>clase abstracta</strong></em> sigue siendo un concepto, pero a diferencia de la clase normal (<strong><em>clase concreta</em></strong>) esta no puede ser instanciada.</p> <p>Una <em><strong>clase abstracta</strong></em> posee <em><strong>funciones abstractas</strong></em>, son métodos que no han sido escritos, sólo está su cabecera, y sólo estas clases pueden representarlos, su objetivo es ser escritos (<em><strong>implementados</strong></em>) por las <em><strong>subclases</strong></em>, y así aplicar el polimorfismo explicado en la <a href="Diseno-Orientado-a-Objetos-Unidad-II">Unidad II</a>.</p> <p>Explicaré mejor las diferencias entre <em><strong>clases abstractas</strong></em> y <em><strong>clases concretas</strong></em> mediante una tabla:</p> <table border="0"> <tbody> <tr> <td><em><strong>Clases Abstractas</strong></em></td> <td><strong><em>Clases Concretas</em></strong></td> </tr> <tr> <td>Se usan para generalizar o clasificar clases concretas</td> <td>Se usan para representar un objeto</td> </tr> <tr> <td>Son usadas para ser heredadas, por que no pueden ser instanciadas</td> <td>Pueden ser instanciadas y heredadas si se desea</td> </tr> <tr> <td>Poseen métodos abstractos (sin implementación)</td> <td>No poseen métodos abstractos</td> </tr> <tr> <td>Poseen métodos implementados</td> <td>Poseen métodos implementados</td> </tr> </tbody> </table> <p><em>Para crear una clase o función abstracta usaremos la palabra reservada <strong>abstract</strong></em>.</p> <p>Ahora mejorando el código de la <a href="Diseno-Orientado-a-Objetos-Unidad-II">Unidad II</a>, la nueva <em><strong>superclase</strong></em>:</p> <p><em><strong>Nuevo Archivo: Figura.php</strong></em></p> <pre><?php<br /><br />abstract class Figura {//Inicio de la clase abstracta<br /><br /> //Atributos<br /> private $color;<br /> private $nombre;<br /><br /> //Funciones<br /> public function getColor(){<br /> return $this->color;<br /> }<br /><br /> public function setColor($color){<br /> $this->color=$color;<br /> }<br /><br /> public function getNombre(){<br /> return $this->nombre;<br /> }<br /><br /> public function setNombre($nombre) {<br /> $this->nombre=$nombre;<br /> }<br /><br /> abstract public function area();//Funcion sin implementacion<br /><br />}//Fin de la clase<br /><br />?></pre> <p>Notemos la sintaxis, en la cabecera de la clase se colocó <em><strong>abstract class</strong></em>, y ahora la función area() también es abstracta, notemos que no tiene llaves <strong>{...}</strong>, la función termina en punto y coma <strong>;</strong></p> <pre>abstract public function area();//Funcion sin implementacion</pre> <p>Si intentaramos instanciar Figura generaría un error ( <strong>$figura = new Figura()</strong>; )</p> <pre><strong>Fatal error</strong>: Cannot instantiate abstract class Figura in...</pre> <p>Este dice que no se puede instanciar una clase abstracta.</p> <p>Los otros archivos quedarían igual.</p> <h2>Interfaz</h2> <p>Una interfaz es una colección de funciones sin implementación, son similares a las clases abstractas, no pueden ser instanciadas, pero además <strong>todas</strong> las funciones son abstractas, su objetivo principal es obligar a las <em><strong>clases concretas</strong></em> a que implementen todos sus métodos abstractos, así se asegura que todas las clases que la usen o mejor dicho que implementen la interfaz tengan los métodos que deben ser comunes, y asegurar el polimorfismo de los mismos. Si una <em><strong>clase abstracta</strong></em> implementa una interfaz no necesita implementar las funciones de la misma.</p> <p>Para declarar una interfaz usaremos la palabra reservada <em><strong>interface</strong></em>.</p> <p><em><strong>Archivo: IFigura.php</strong></em></p> <pre><?php<br /><br />interface IFigura {//Inicio de la interfaz<br /><br /> public function area();<br /> <br />}//Fin de la interfaz<br /><br />?></pre> <p>Ahora cambiemos la clase abstracta Figura, simplemente eliminamos el método area();</p> <p>Luego veamos como quedaria la clase Rectangulo, para usar una interfaz usaremos la palabra <em><strong>implements</strong></em>:</p> <p><em><strong>Nuevo Archivo: Rectangulo.php</strong></em></p> <pre><?php<br /><br />class Rectangulo extends Figura implements IFigura {//Inicio de la clase<br /><br /> //Atributos<br /> private $ladoA;<br /> private $ladoB;<br /><br /> //Funciones<br /> public function getLadoA(){<br /> return $this->ladoA;<br /> }<br /><br /> public function setLadoA($ladoA){<br /> $this->ladoA=$ladoA;<br /> }<br /><br /> public function getLadoB(){<br /> return $this->ladoB;<br /> }<br /><br /> public function setLadoB($ladoB){<br /> $this->ladoB=$ladoB;<br /> }<br /><br /> //Funcion Polimorfica<br /> public function area(){<br /> return ($this->ladoA*$this->ladoB);<br /> }<br /> <br />}//Fin de la clase<br /><br />?></pre> <p>Si no implementaramos area() cuando corrieramos el codigo pasaría esto:</p> <pre><strong>Fatal error</strong>: Class Rectangulo contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (IFigura::area) in...</pre> <p>Nos dice que hay un método abstracto declarado en la interfaz y que en Rectangulo no ha sido implementado.</p> <p>Recordemos incluir la interfaz en el index:</p> <p><em><strong>Nuevo Archivo: index.php</strong></em></p> <pre><?php<br /><br />include 'Figura.php';<br />include 'IFigura.php';//Nueva inclusion<br />include 'Triangulo.php';<br />include 'Rectangulo.php';<br /><br />.<br />.<br />.<br /><br />?></pre> <p><span><span><span><span><span>Recuerda hacer preguntas si tienes dudas en algo...</span></span></span></span></span></p>
o salir
¡Amigo! te demorarás 10 segundos en crear tu cuenta.
Crear cuenta o acceder
Nick o e-mail Es el nombre visible de tu cuenta y te servirá para acceder a ella. Permitido espacios y cualquier caracter.
Contraseña Una clave única para acceder a tu cuenta.
Transcribe el código en la dirección indicada con el fin de evitar el SPAM.
Identificación Tu identificación es el nick o el e-mail de tu cuenta.
Contraseña La clave de tu cuenta. ¿No la recuerdas?
Recordar por diez días
Disfrutarás de todos los beneficios de DocumentoWeb.
Twitter Facebook Feed RSS
www.DocumentoWeb.com - Licencia Creative Commons