Абстрактные классы и методы (Rating: +8)

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

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

Немного практики
В качестве примера обоих типов абстрагирования, приведу следующую задачу:
Задача: Реализовать классы шахматных фигур для игры в шахматы.
Предметная область: Движение шахматные фигуры подчиняются правилам шахматной игры. В частности отличительными характеристиками является форма движения и число доступных ходов. Среди шахматных фигур нет таких, которые не могут ходить в игре, т.е. форма движения и число доступных ходов - это свойства, которые есть у всех шахматных фигур, различны только значения.
Реализация:
Данная реализация упрощена для примера.
Как можно заметить из предметной области, все классы шахматных фигур имеют общие корни в виде абстрактного понятия - шахматная фигура. Для программирования этой ассоциации достаточно реализовать абстрактный класс, который будет являться родительским, по отношению ко всем фигурам.
<?php
// Инстанциирование (создание экземпляра) класса "Шахматная фигура" не имеет смысла, потому он объявлен как абстрактный
// Вынесение общей структуры в абстрактный класс
abstract class Chessman{
  // Метод служит для изменения положения шахматной фигуры. В частности он заставляет шахматную фигуру "пойти" из текущей клетки доски, в заданную клетку $cell
  // Метод объявлен как абстрактный, потому что его реализация зависит от конкретной шахматной фигуры, то есть тело метода на данном уровне абстракции определить невозможно
  public abstract function move(Cell $cell);

  // Метод определяет, доступно ли движение на клетку $cell для данной фигуры
  public abstract function isMovementAvailable(Cell $cell);
}

class Horse extends Chessman{
  public function move(Cell $cell){
    // Реализация движения фигуры "Конь"
  }

  public function isMovementAvailable(Cell $cell){
    ...
  } 
}

// Любой метод или функция теперь может работать не с конкретными фигурами, а их общей часть - классом Chessman
// Обеспечение полиморфности
function isMovementAvailable(Chessman $chessman, Cell $cell){
  // Не важно какая именно фигура передана, так как все дочерние классы Chessman реализуют метод isMovementAvailable
  return $chessman->isMovementAvailable($cell);
}
Added:
Rating: +8
Views: 2050
Comments (1) »