Приднестровская поддержка XOOPS
В отличие от абстрактных классов, посредством которых можно выражать абстрактные понятия в программах, интерфейсы предназначены для того, чтобы обеспечить определенную функциональность внутри класса. Если выражаться точнее, то интерфейс представляет собой средство для определения набора методов, которые должен иметь класс, реализующий данный интерфейс. Чтобы использовать интерфейс, его необходимо объявить с указанием ключевого слова interface, как показано в листинге 16.
interface printable {
public function printme();
}
Чтобы интерфейс приносил определенную пользу, он должен быть реализован с помощью одного или нескольких классов. В листинге 16 определен интерфейс printable, который заявляет, что любой класс, реализующий этот интерфейс, должен реализовать метод printme(). Чтобы создать класс, реализующий подобный интерфейс, в определении класса используется ключевое слово implements, за которым следует список реализованных интерфейсов (см. листинг 17).
class Integer implements printable {
private $value;
public function getValue() {
return (int)$this->value;
}
public function printme() {
echo (int)$this->value;
}
}
В этом листинге определен исходный класс Integer из листинга 15, чтобы реализовать интерфейс printable, определенный в листинге 16. Как класс, реализующий этот интерфейс, он гарантирует, что класс Integer предложит все методы, которые определены в интерфейсе.
Теперь, когда определено, что класс реализует заданный интерфейс, можно гарантировать, что любые функции или методы, для которых требуются некоторые действия со стороны класса, получат их, и для этого нет необходимости проверять экземпляр с помощью операции instanceof. Эти способы можно использовать для определения интерфейса printable, как показано в листинге 18.
interface printable {
public function printme();
}
abstract class Number {
private $value;
abstract public function value();
public function reset() {
$this->value = NULL;
}
}
class Integer extends Number implements printable {
private $value;
function __construct( $value ) {
$this->value = $value;
}
public function getValue() {
return (int)$this->value;
}
public function printme() {
echo (int)$this->value;
}
public function value() {
return (int)$this->value;
}
}
/* Создание функции, которую требует интерфейс printable. */
function printNumber(printable $myObject) {
/* Если эта функция будет вызвана, мы точно знаем, что она
имеет метод printme() */
$myObject->printme();
}
$inst = new Integer(10);
printNumber($inst);
В листинге 18 интерфейсы использовались для гарантии того, что функция printNumber() будет всегда получать объект, имеющий метод printme(). Другая полезная особенность заключается в том, что один класс может реализовать несколько различных интерфейсов. Пример этого можно видеть в листинге 19.
interface printable {
public function printme();
}
interface Inumber {
public function reset();
}
class Integer implements printable, Inumber {
private $value;
function __construct( $value ) {
$this->value = $value;
}
public function printme() {
echo (int)$this->value;
}
public function reset() {
$this->value = NULL;
}
public function value() {
return (int)$this->value;
}
}
function resetNumber( Inumber $obj ) {
$obj->reset();
}
function printNumber( printable $obj ) {
$obj->printme();
}
$inst = new Integer( 10 );
printNumber( $inst );
resetNumber( $inst );
Отправитель | Нити |
---|
5 пользователь(ей) активно (3 пользователь(ей) просматривают Инструкции)
Участников: 0 Гостей: 5 далее... |