Uso de clases abstractas
Supongamos la siguiente situación:
Tenemos que implementar un objeto que representa una figura. Sus propiedades serán base y altura. El único método será area, que calculará el área de la figura.
Obviamente, el área se calculará de una forma u otra dependiendo de qué figura se trate.
Una primera aproximación podría llevarnos a esto:
Class Shape { private $base; private $height; public function Shape($base, $height) { $this->base = $base; $this->height = $height; } public function area($type) { switch ($type) { case 'rectangle': return $this->base * $this->height; break; case 'triangle': return ($this->base * $this->height) / 2; break; } } // }
Y así deberíamos ir colocando todas las posibles figuras distintas en los casos del switch.
Sin embargo, esto nos obliga a estar editando esta clase cada vez que queramos incluir una figura nueva a la que calcular su área.
Una solución más elegante la proporcionan las clases abstractas. Una clase abstracta permite definir un objeto que no será instanciado, pero del que podremos heredar para crear objetos nuevos.
En el ejemplo de la figura, el código quedaría así:
Abstract Class Shape { protected $base; protected $height; abstract public function area(); }
Observamos que el método area presenta solo su signatura. Su implementación debe realizarse en las clases que hereden de Shape. De este modo, podemos crear un objeto por cada figura distinta que necesitemos para trabajar.
Por ejemplo:
Class Rectangle extends Shape { public function Rentangle($base, $height) { $this->base = $base; $this->height = $height; } public function area() { return $this->base * $this->height; } } Class Triangle extends Shape { public function Triangle($base, $height) { $this->base = $base; $this->height = $height; } public function area() { return ($this->base * $this->height) / 2; } }
o cualquier otra figura que queramos.
Este ejemplo es muy obvio y puede encontrarse en la documentación de PHP, en uno de sus comentarios. Un ejemplo de uso menos trivial sería el siguiente:
Imaginemos que tenemos una serie de tablas distintas en una base de datos pero que tienen la misma estructura, formada por un identificador, ID, y un campo Name.
Podríamos crear varios objetos, uno por cada una de esas tablas, para manejar la selección y edición de datos de las mismas. Como es natural, esto se hace muy pesado porque estamos repitiendo código sin motivo. Es mejor utilizar una clase abstracta:
Abstract Class NamedList { protected $id; protected $name; public $data = array(); public function setID($id) { $this->id = $id; } public function setName($name) { $this->name = $name; } public function getID() { return $this->id; } public function getName() { return $this->name; } public function getData() { return $this->data; } // }
A partir de ella podemos crear objetos que se encarguen solo del acceso a los datos:
Class TableManagement extends NamedList { public function add() { } public function update($id) { } public function delete($id) { } // ... }
Está muy bien explicado, aunque esto si que ya lo domino :D. Por ahondar, o mejor dicho complicar, las cosas:
El Poliformismo se usa sobre todo para juegos. Vease el caso más simple el de un ajedrez, donde cada tipo de ficha heredaría de una única clase, llamada “Ficha”(es la llamada clase universal) y en la que se establece la interfaz común para todas ellas. Por ejemplo: Mover()
Está claro que no todas se mueven de igual forma, de ahi que existan clase Torre que hereden de Ficha y que implemente su propia forma de moverse. Sobre C++, el tablero sería un array de arrays de punteros a clase Ficha, y claro, en esa ficha como se ha dicho, podría ser o bien una Torre, o un árfil,…
En otros juegos, podría existir, como clases universales, la clase marcianito, o la clase bola(en el caso del comecoco ), o la clase unidad(en Warcraft ), o la clase ladrillo ( Arkanoid ),…
En mi cms yo uso esto, como te comenté, para sistema de eventos ya te lo enseñaré. Aunque… se parecería más a la parte de los últimos ejemplos, que tu has puesto y no a la clase universal.
La verdad es que es un buen artículo para los que comienzan.
Comment by CeltaProscrito — August 25, 2007 @ 12:48 pm