- Абстрактные классы, Перегрузка методов
Печать: Шрифт: Абв Абв Абв
admin 28 Февраля 2006 в 17:02:21
Абстрактные классы

В некоторых ситуациях бывает удобно создать класс, объекты которого никогда не создаются (данный класс нужен всего лишь как базовый для создания производных классов). Такие классы называются абстрактными. Абстрактные классы обычно применяются в тех случаях, когда разработчик программы хочет обеспечить обязательную поддержку некоторых функциональных возможностей всеми классами, производными от абстрактного базового класса.

В РНР отсутствует прямая поддержка абстрактных классов, однако существует простое обходное решение — достаточно определить в «абстрактном» классе конструктор и включить в него вызов die( ). Вернемся к классам из листинга 6.4. Скорее всего, вам никогда не придется создавать экземпляры классов Land и Vehicle, поскольку они не могут представлять физические объекты. Для представления реальных объектов (например, автомобилей) следует создать класс, производный от этих классов. Следовательно, чтобы предотвратить возможное создание объектов классов Land и Vehicle, необходимо включить в их конструкторы вызовы die( ), как показано в листинге 6.5.

Листинг 6.5. Создание абстрактных классов

<?
class Vehicle {
Объявления атрибутов...
function
Vehicle() }
die (
"Cannot create Abstract Vehicle class!");
}
Объявления других методов...
}
class
Land extends Vehicle {
Объявления атрибутов...
function
Land() }
die (
"Cannot create Abstract Land class!");
}
Объявления других методов. } class Car extends Land {
Объявления атрибутов...
Объявления методов...
}
?>


Попытка создания экземпляра этих абстрактных классов приведет к выдаче сообщения об ошибке и завершению программы.

Перегрузка методов

Перегрузкой методов называется определение нескольких методов с одинаковыми именами, но разным количеством или типом параметров. Как и в случае с абстрактными классами, в РНР эта возможность не поддерживается, но существует простое обходное решение, приведенное в листинге 6.6.

Листинг 6.6. Перегрузка методов

<?
class Page {
var
$bgcolor;
var
$textcolor;
function
Page() {
// Определить количество переданных аргументов
// и вызвать метод с нужным именем
$name = "Page".func_num_args();
// Call $name with correct number of arguments passed in
if ( func_num_args() == 0 ) :
$this->$name();
else :
$this->$name(func_get_arg(0));
endif;
}
function
Page0() {
$this->bgcolor = "white";
$this->textcolor = "black";
print
"Created default page";
}
function
Page1($bgcolor) {
$this->bgcolor = $bgcolor;
$this->textcolor = "black";
print
"Created custom page";
}
}
$html_page - new Page("red");
?>


В этом примере при создании нового объекта с именем $html_page передается один аргумент. Поскольку в классе был определен конструктор по умолчанию (Раgе( )), вызывается именно он. Однако конструктор по умолчанию всего лишь выбирает, какому из конструкторов (Page0( ) или Page1( )) следует передать управление. При выборе конструктора используются функции func_num_args( ) и func_get_arg( ), которые, соответственно, определяют количество аргументов и читают эти аргументы.

Конечно, такое решение вряд ли можно назвать полноценной перегрузкой, но оно подойдет для тех, кто не может жить без этого важного аспекта ООП.
Комментарии, по рейтингу, по дате
  Гость 22.08.2011 в 17:24:53   # 140545
  Гость 22.08.2011 в 17:25:33   # 140549
  Гость 22.08.2011 в 17:25:55   # 140550
  Гость 22.08.2011 в 17:26:30   # 140551
Продажа качественной спецодежды, спецодежда по приемлемой стоимости
  Гость 22.08.2011 в 17:26:55   # 140552
  Гость 22.08.2011 в 17:27:20   # 140553
  eric_land 22.08.2011 в 18:00:37   # 140559
.........................

  Гость 22.08.2011 в 20:13:55   # 140568
  Гость 22.08.2011 в 20:15:04   # 140569
  Гость 22.08.2011 в 20:15:32   # 140570
  Гость 22.08.2011 в 20:15:53   # 140571
  Гость 22.08.2011 в 20:16:17   # 140572
  Гость 22.08.2011 в 20:16:37   # 140573
Добавить сообщение
Чтобы добавлять комментарии зарeгиcтрирyйтeсь