Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];
ВнизАбстрактные функции Найти похожие ветки
← →
User (2003-05-12 09:52) [0]Привет!
Народ, объясните необходимость абстрактных функций?
почему нельзя их создать в дочерних классах, зачем писать лишний код?
Спасибо
← →
Reindeer Moss Eater (2003-05-12 09:56) [1]Как раз затем, что бы не писать лишний код.
← →
MBo (2003-05-12 09:58) [2]Для того, чтобы можно было один код применять к любому наследнику базового класса с реализованными функциями.
Читай об ООП, виртуальных функциях.
← →
VaS (2003-05-12 10:12) [3]Есть такие страшные слова - обобщение и полиморфизм.
← →
Palladin (2003-05-12 10:56) [4]простейший пример, навеяно встреченой веткой в "потрепатся"
TFigure=class // класс какойто фигуры
procedure Draw; virtual; abstract;
end;
TCircle=class(TFigure) // класс окружности
procedure Draw; override;
end;
TRect=class(TFigure) // класс прямоугольника
procedure Draw; override;
end;
что у нас есть:
У нас есть класс TFigure с абстрактным методом Draw который выполняет прорисовку фигуры, но сам класс понятия не имеет как себя рисовать ибо он не знает даже что он за фигура, и поэтому предлагает (virtual; abstract;) реализовать данное действие своим наследникам, которые успешно это и делают (override);
для чего это надо и как это использовать:
предположим мы пишем свой редактор векторной графики, и нам нужно хранить нарисованные объекты в списке TList и давать им команду нарисоватся. Но фигуры бывают разные, и если бы не волшебство virtual и abstract нам бы пришлость: либо создать несколько списков фигур например: Circles:TList; и Rects:TList; что бы потом давать команду нарисоватся как TCircle(Circles[i]).Draw; и TRect(Rects[i]).Draw;, это конечно все прекрасно, но что же будет и сколько нам придется еще написать если вдруг появится необходимость введения еще одного класса TTriangle - класс треугольника, и второй момент, нам же нужно рисовать в той последовательности в которой фигуры создавались, а не: сначала окружности, а потом прямоугольники. Вот всех этих неприятностей и позволяет избежать abstract; однажды объявив в классе TFigure метод Draw, мы:
во-первых - позволили классам наследникам реализовывать его по своему (virtual)
во-вторых - запретили вызов оригинального метода TFigure.Draw ибо это нонсес (abstract)
тогда вся работа с рисованием фигур сводится к следующему
обявляется единый список объектов
var
Figures:TFigures;
для добавления используется следующая вещь
Figures.Add(TCircle.Create);
Figires.Add(TRect.Create);
и в конце концов для отрисовки всех фигур нам остается лишь вызвать
TFigure(Figures[i]).Draw;
вся приятность заключается в том что нам не нужно дополнять код отрисовки при вводе нового класса-наследника TTriangle=class(TFigure)
...
Figures.Add(TTriangle.Create);
отрисовка произойдет так как и надо
надеюсь теперь тебе примерно ясно для чего введено virtual; abstract;
для более углубленного изучения принципов ООП рекомендую
Гради Буч "Объектно-Ориентированный анализ и проектирование"
второе издание, (хотя говорят что в первом есть примеры на Delphi)
ЗЫ
киньте в меня камнем где я не прав...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c