Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.22;
Скачать: CL | DM;

Вниз

Абстрактные функции   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
14-70455
race1
2003-04-30 10:45
2003.05.22
теория


14-70462
Antosik
2003-05-01 19:09
2003.05.22
Отчёты в дельфях


3-70123
Ann
2003-04-30 13:06
2003.05.22
EhLib 2.0


1-70204
Sensor
2003-05-04 23:59
2003.05.22
Работа с реестром


14-70448
Den
2003-05-03 00:06
2003.05.22
Скучно :*(((((((