Абстрактные классы и методы (Rating: +8)
Немного теории
Абстракция в ООП тесно связана с такими важными характеристиками, как наследование и полиморфизм. В частности, к абстракции прибегают с целью упрощения объекта, выделения общих, важных в данном контексте закономерностей и отвлечения от несущественных деталей.
Во время проектирования класса, часто можно столкнуться с необходимостью вынесения общей структуры нескольких классов в один общий, но не законченный для полноценного использования класс. Для этих целей хорошо подойдет абстрактный класс, который будет содержать некоторую общую структуру (свойства и методы), но не достаточную, для его полноценного использования (инстанциирования).
Абстракция не только позволяет выделить общие части структуры классов в родительский объект, но и обеспечить дальнейшую переносимость за счет полиморфизма. Если некоторые классы представляют одну и ту же сущность, то наследование их от абстрактного класса позволяет задать эту ассоциацию программно. Такой подход позволит заменить один конкретный класс другим, не изменяя код. Часто это применяется в том случае, когда необходимо работать с общей структурой, а их частная часть не требуется.
Немного практики
В качестве примера обоих типов абстрагирования, приведу следующую задачу:
Задача: Реализовать классы шахматных фигур для игры в шахматы.
Предметная область: Движение шахматные фигуры подчиняются правилам шахматной игры. В частности отличительными характеристиками является форма движения и число доступных ходов. Среди шахматных фигур нет таких, которые не могут ходить в игре, т.е. форма движения и число доступных ходов - это свойства, которые есть у всех шахматных фигур, различны только значения.
Реализация:
Данная реализация упрощена для примера.
Как можно заметить из предметной области, все классы шахматных фигур имеют общие корни в виде абстрактного понятия - шахматная фигура. Для программирования этой ассоциации достаточно реализовать абстрактный класс, который будет являться родительским, по отношению ко всем фигурам.
Added: Артур
27.08.2012 / 09:29Абстракция в ООП тесно связана с такими важными характеристиками, как наследование и полиморфизм. В частности, к абстракции прибегают с целью упрощения объекта, выделения общих, важных в данном контексте закономерностей и отвлечения от несущественных деталей.
Во время проектирования класса, часто можно столкнуться с необходимостью вынесения общей структуры нескольких классов в один общий, но не законченный для полноценного использования класс. Для этих целей хорошо подойдет абстрактный класс, который будет содержать некоторую общую структуру (свойства и методы), но не достаточную, для его полноценного использования (инстанциирования).
Абстракция не только позволяет выделить общие части структуры классов в родительский объект, но и обеспечить дальнейшую переносимость за счет полиморфизма. Если некоторые классы представляют одну и ту же сущность, то наследование их от абстрактного класса позволяет задать эту ассоциацию программно. Такой подход позволит заменить один конкретный класс другим, не изменяя код. Часто это применяется в том случае, когда необходимо работать с общей структурой, а их частная часть не требуется.
Немного практики
В качестве примера обоих типов абстрагирования, приведу следующую задачу:
Задача: Реализовать классы шахматных фигур для игры в шахматы.
Предметная область: Движение шахматные фигуры подчиняются правилам шахматной игры. В частности отличительными характеристиками является форма движения и число доступных ходов. Среди шахматных фигур нет таких, которые не могут ходить в игре, т.е. форма движения и число доступных ходов - это свойства, которые есть у всех шахматных фигур, различны только значения.
Реализация:
Данная реализация упрощена для примера.
Как можно заметить из предметной области, все классы шахматных фигур имеют общие корни в виде абстрактного понятия - шахматная фигура. Для программирования этой ассоциации достаточно реализовать абстрактный класс, который будет являться родительским, по отношению ко всем фигурам.
<?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); }
Rating:
+8
Views: 2050Comments (1) »