Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-70239
FOZi
2003-05-12 01:45
2003.05.22
Заголовок в таскбаре Application.Title?


1-70252
Litvin
2003-05-12 10:54
2003.05.22
округление значения аргумента


14-70494
Mop
2003-05-03 04:09
2003.05.22
Прикол с сис. блоком!


1-70279
nevalex
2003-05-11 19:47
2003.05.22
Как организовать поиск


8-70400
Unicorn
2003-02-11 09:47
2003.05.22
Нужно сделать несколько анимированных кнопок





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский