Объектно-ориентированные программы строятся на основе иерархической структуры классов. В языках с одним наследованием, таких как PHP, наследование классов является древовидным. Корневой класс имеет один или несколько подклассов, а затем один или несколько подклассов наследуются от каждого подкласса. . Дополнительные подкатегории следующего уровня. Конечно, для реализации разных функций может использоваться несколько корневых классов. В хорошо спроектированной архитектуре каждый корневой класс должен иметь полезный интерфейс, который может использоваться кодом приложения. Если код нашего приложения предназначен для работы с корневым классом, он также может работать с любым подклассом, наследуемым от корневого класса.
Абстрактный метод похож на заполнитель для обычного метода в подклассе (он занимает место, но не имеет никакого эффекта), но в отличие от обычного метода он не имеет никакого кода. Если в классе есть один или несколько абстрактных методов, то класс становится абстрактным классом. Вы не можете создавать экземпляры абстрактных классов. Вы должны наследовать их, а затем создавать экземпляры подклассов. Вы также можете рассматривать абстрактные классы как шаблон для подклассов.
Если вы переопределите все абстрактные методы, подкласс станет обычным классом. Если не все методы переопределены, подкласс по-прежнему является абстрактным. Если класс содержит абстрактный метод (даже если он только один), вы должны объявить класс абстрактным, добавив абстрактное перед ключевым словом class.
Синтаксис объявления абстрактного метода отличается от синтаксиса объявления общего метода. У абстрактного метода нет основного тела, заключенного в фигурные скобки {}, как у общего метода, и он заканчивается точкой с запятой;.
В примере 6.13 мы определяем класс Shape, содержащий метод getArea. Но поскольку определить площадь фигуры, не зная формы, невозможно, мы объявили метод getArea как абстрактный метод. Вы не можете создать экземпляр объекта Shape, но можете наследовать его или использовать в выражении, как в примере 6.13.
Если вы создаете класс только с абстрактными методами, вы определяете интерфейс. Чтобы проиллюстрировать эту ситуацию, PHP имеет интерфейс и реализует ключевые слова. Вы можете использовать интерфейс вместо абстрактных классов и реализовывать вместо расширений для описания определения вашего класса или использовать интерфейс. Например, вы можете написать myClass, реализующий myIterface. Вы можете выбирать между этими двумя методами в зависимости от личных предпочтений.
/*Примечание:
Эти два метода относятся к:
1. абстрактный класс aaa{} (обратите внимание, что в aaa есть только абстрактные методы, общих методов нет)
класс bbb расширяет aaa{} (переопределить абстрактный метод в aaa в bbb)
2. интерфейс ааа{}
класс bbb реализует aaa{} (переопределить абстрактный метод в aaa в bbb)
*/
Листинг 6.13. Абстрактные классы
//абстрактный корневой класс абстрактный корневой класс
абстрактный класс Форма
{
абстрактная функция getArea(); //Определение абстрактного метода
}
//абстрактный дочерний класс абстрактный подкласс
абстрактный класс Polygon расширяет форму //Polygon
{
абстрактная функция getNumberOfSides();
}
//конкретный класс класса сущности класса треугольника
класс Triangle расширяет Polygon
{
общедоступная $база;
public $height;
public function getArea() //Переопределить метод вычисления площади{
return(($this->base * $this->height)/2);
}
public function getNumberOfSides() //Переопределить метод подсчета сторон{
возврат(3);
}
}
//конкретный класс сущности класса четырехугольник
класс Rectangle расширяет Polygon
{
общественная ширина $;
общественная $height
общественная функция getArea();
{
return ($this->width * $this->height);
}
Публичная функция getNumberOfSides()
{
возврат (4);
}
}
//конкретный круг класса сущности класса
класс Circle расширяет форму
{
общественная $radius
общественная функция getArea();
{
return(pi() * $this->radius * $this->radius);
}
}
//конкретный корневой класс определяет класс цвета
классЦвет
{
публичное $имя;
}
$myCollection = array(); //Создаем коллекцию фигур и помещаем ее в массив
//создаем прямоугольник
$r = новый прямоугольник;
$r->ширина = 5;
$r->высота = 7;
$myCollection[] = $r;
unset($r);
//создаем треугольник
$t = новый треугольник;
$т->база = 4;
$t->высота = 5;
$myCollection[] = $т;
unset($t);
//сделаем круг
$c = новый круг;
$c->радиус = 3;
$myCollection[] = $c;
unset($c);
//создаем цвет
$c = новый цвет;
$c->name = "синий";
$myCollection[] = $c;
unset($c)
($myCollection как $s);
{
if($s instanceof Shape) //Если $s является экземпляром класса Shape{
print("Область: ". $s->getArea(). "n");
}
if($s экземпляр многоугольника)
{
print("Стороны: " .$s->getNumberOfSides()."n");
}
if($s экземпляр цвета)
{
print("Цвет: $s->имя n");
}
Печать("Н");
}
?>