Los programas orientados a objetos se construyen a través de una estructura jerárquica de clases. En lenguajes de herencia única como PHP, la herencia de clases es similar a un árbol. Una clase raíz tiene una o más subclases, y luego una o más subclases se heredan de cada subclase. Más subcategorías del siguiente nivel. Por supuesto, pueden utilizarse varias clases raíz para implementar diferentes funciones. En una arquitectura bien diseñada, cada clase raíz debe tener una interfaz útil que pueda ser utilizada por el código de la aplicación. Si el código de nuestra aplicación está diseñado para funcionar con la clase raíz, también puede funcionar con cualquier subclase que herede de la clase raíz.
Un método abstracto es como un marcador de posición para un método normal en una subclase (ocupa espacio pero no tiene ningún efecto), pero a diferencia de un método normal, no tiene ningún código. Si hay uno o más métodos abstractos en una clase, entonces la clase se convierte en una clase abstracta. No puede crear instancias de clases abstractas. Debe heredar de ellas y luego crear instancias de subclases. También puede pensar en las clases abstractas como una plantilla para subclases.
Si anula todos los métodos abstractos, la subclase se convierte en una clase normal. Si no se anulan todos los métodos, la subclase sigue siendo abstracta. Si una clase contiene un método abstracto (incluso si solo hay uno), debe declarar la clase como abstracta agregando abstract antes de la palabra clave class.
La sintaxis de declarar un método abstracto es diferente de la de declarar un método general. El método abstracto no tiene el cuerpo principal entre llaves {} como el método general y termina con un punto y coma.
En el ejemplo 6.13, definimos una clase Forma que contiene un método getArea. Pero como es imposible determinar el área de la figura sin conocer la forma, declaramos el método getArea como un método abstracto. No se puede crear una instancia de un objeto Forma, pero se puede heredar de él o utilizarlo en una expresión, como en el ejemplo 6.13.
Si crea una clase con solo métodos abstractos, define una interfaz. Para ilustrar esta situación, PHP tiene la interfaz e implementa palabras clave. Puede usar una interfaz en lugar de clases e implementos abstractos en lugar de extensiones para describir la definición de su clase o usar una interfaz. Por ejemplo, puede escribir myClass implements myIterface. Puede elegir entre estos dos métodos según sus preferencias personales.
/*Nota:
Los dos métodos se refieren a:
1. clase abstracta aaa {} (tenga en cuenta que en aaa solo hay métodos abstractos, no métodos generales)
la clase bbb extiende aaa{} (anula el método abstracto en aaa en bbb)
2. interfaz aaa{}
la clase bbb implementa aaa{} (anula el método abstracto en aaa en bbb)
*/
Listado 6.13 Clases abstractas
//clase raíz abstracta clase raíz abstracta
forma de clase abstracta
{
función abstracta getArea(); //Definir un método abstracto
}
// clase secundaria abstracta subclase abstracta
clase abstracta Polígono extiende Forma //Polígono
{
función abstracta getNumberOfSides();
}
//clase concreta clase de entidad clase de triángulo
clase Triángulo extiende Polígono
{
base de $ pública;
public $height;
public function getArea() //Anula el método de cálculo del área{
return(($this->base * $this->altura)/2);
}
función pública getNumberOfSides() //Anular el método de recuento lateral{
retorno(3);
}
}
//clase concreta entidad clase cuadrilátero
clase Rectángulo extiende Polígono
{
ancho $ público;
público $altura;
función pública getArea()
{
return($esto->ancho * $esto->alto);
}
función pública getNumberOfSides()
{
retorno(4);
}
}
// círculo de clase de entidad de clase concreta
clase Círculo extiende Forma
{
público $radio;
función pública getArea()
{
return(pi() * $this->radio * $this->radio);
}
}
//la clase raíz concreta define una clase de color
claseColor
{
nombre público $;
}
$myCollection = array(); //Crea una colección de formas y colócala en una matriz
//crea un rectángulo
$r = nuevo Rectángulo;
$r->ancho = 5;
$r->altura = 7;
$miColección[] = $r;
unset($r);
//hace un triángulo
$t = nuevo Triángulo;
$t->base = 4;
$t->altura = 5;
$miColección[] = $t;
unset($t);
//hace un círculo
$c = nuevo círculo;
$c->radio = 3;
$miColección[] = $c;
unset($c);
//crea un color
$c = nuevo color;
$c->nombre = "azul";
$miColección[] = $c;
unset($c);
foreach($miColección como $s)
{
if($s instancia de Forma) //Si $s es una instancia de la clase Forma{
print("Área: " . $s->getArea() . "n");
}
if($s instancia de polígono)
{
print("Lados: " .$s->getNumberOfSides()."n");
}
si($s instancia de Color)
{
print("Color: $s->nombre n");
}
imprimir("n");
}
?>