Скажите в двух словах, какой главный смысл полиморфизма(читал что 1 интерфейс и множество реализаций), и приведенный код нже демонстрирует ли полиморфизм? PHP: <?php header('content-type: text/html;charset=utf-8'); ?> <? // Класс Фигуры (какой фигуры - неизвестно. просто фигуры) abstract class Figure { abstract public function Draw(); // абстрактный метод «Нарисовать фигуру» } // Класс Треугольника class Triangle extends Figure { public function Draw() { // метод «Нарисовать треугольник» echo 'рисуем треугольник '.'<br/>'; } } // Класс Эллипса class Ellipse extends Figure { public function Draw() { // метод «Нарисовать эллипс» echo 'рисуем эллипс '.'<br/>'; } } // Класс Круга class Circle { public function Draw() { // метод «Нарисовать круг» echo 'рисуем круг '.'<br/>'; } } // Класс Прямоугольника class Rectangle extends Figure { public function Draw() { // метод «Нарисовать прямоугольник» echo 'рисуем прямоугольник '.'<br/>'; } } // обыкновенная функция рисования фигуры function drawFigure($fig) { if ($fig instanceof Figure) { $fig->Draw(); // тут мы на этапе написания этой функции не знаем, // какая именно фигура будет рисоваться, а интерпретатор // php это знает только на этапе выполнения скрипта } else { echo 'Неизвестная фигура'; } } // создадим фигуры $triangle = new Triangle(); // треугольник $ellipse = new Ellipse(); // эллипс $rectangle = new Rectangle(); // прямоугольник $circle = new Circle(); // круг // нарисуем прямоугольник drawFigure($rectangle); // нарисуем эллипс drawFigure($ellipse); // попытаемся нарисовать круг drawFigure($circle); ?> НЕ понятно вот это место: PHP: //Скажите $fig в этот параметр передаются объекты в качестве параметра //и вот эта переменная $fig превращается в объект? function drawFigure($fig) { if ($fig instanceof Figure) { //А здесь сравнивается является ли объект под названием $fig //объектом класса под названием Figure? $fig->Draw(); } else { echo 'Неизвестная фигура'; } }
демонстрирует ничего там не превращается - что подал, то и будет c пятой версии php можно написать так: PHP: <?php function drawFigure(Figure $fig) { $fig->Draw(); } ?> Функция примет в качестве параметра объект Figure (но т.к. он у тебя абстрактный, ты всё равно не сможешь его создать), или любого его наследника (независимо от глубины наследования). Всё остальное выкинет fatal error. Соль в том, что функция работает с интерфейсом, она знает, что у объекта должен быть метод Draw(), а реализация ей глубоко побоку
1)Я хотел спросить, какой смысл полиморфизма? Напишите маленький скромный пример,чтоб понят зачем он вообще или просто его использовать потому-что это ООП? 2)Абстрактный класс и интерфейс, в чём гласный смысл того и другого? Интерфейс нужен чисто для того чтоб объявить в нём свойства разные и методы, а потом реализовать в других классах которые унаследуют этот интерфейс и всё? А Абстрактный класс нужен для чего в основном, ну смысл его зачем. Дело в том что в разных источниках пишут в общем смысле, а конкретно не понять, зачем то и другое?
вот здесь более реальный пример с чтением/записью http://wiki.agiledev.ru/doku.php?id=ooad:dependency_injection суть в том, что общий алгоритм не меняется, можно подменить части системы В принципе, это одно и то же, только в абстрактном классе можно ещё описать какие-то детали реализации, которые общие для всех наследников.
абстрактные классы, интерфейсы, пространства имен и т.д. нужны для программистов, что бы писать меньше и думать меньше о зависимостях в коде, о том что, как и где используется. Если, например, есть три программиста которые пишут одну программу. И там нужно создать класс вывода какой-то информации. 1-й программист пишет класс для вывода в xml формате, 2-q пишет класс для вывода в текстовый файл как есть, а 3-й пишет часть программы которая и работает с этими классами. Так вот знать какие методы понаписали 1-й и 2-й трудновато, но если оба их класса реализуют один и тот же интерфейс вывода информации, то реализация этих классов не важна и можно работать с интерфейсом, при том еще и вполне спокойно заменить один класс на другой, в зависимости от необходимости. ну по крайней мере я так понимаю это, хотя у меня с ооп не супер.