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

Вниз

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

 
Denis_Ac   (2004-02-04 07:25) [0]

Объясните пожалуйста, в чём смысл абстрактных классов???


 
Anatoly Podgoretsky ©   (2004-02-04 07:39) [1]

Таких нет, а есть базовые классы.


 
Denisac   (2004-02-04 08:06) [2]

Ну то есть классы в которых есть абстрактные методы. Зачем их делат (например TStrings)


 
mfender ©   (2004-02-04 08:07) [3]

Можно и не делать. Но иногда удобно.


 
Beat ©   (2004-02-04 08:27) [4]

Абстрактные классы - это шаблоны для наследников - общие для всех наследников. У них все наследуемые методы не определены, т.е. поведение объектов-наследников определяют сами наследники, а абстрактный класс просто их определения и свойства.

Например:
абстрактный класс - фигура (у него абстрактный метод отрисовки, задания цвета и т.д.), наследники - круг, квадрат и т.д.


 
Denisac   (2004-02-04 08:38) [5]

Ну это-то я всё понимаю только ведь у них не прописаны методы прорисовки, так зачем их делать? Ведь всёравно методы будут
определены у наследников. Или это так для удобства?


 
Beat ©   (2004-02-04 08:46) [6]

Дык, я потом делаю список объектов типа фигура но создаю в зависимости от необходимости нужный мне круг и т.д. А основные свойства одни - отрисовка, премещение, задание цвета и т.п.
Т.е. через родитель оперирую любым наследником.

з.ы. нифига себе для удобства - ты что каждый раз проверять собираешься кто это у тебя и в зависомости от этого вызывать то или другое??? (это я ___СИЛЬНО___ упростил)


 
Reindeer Moss Eater ©   (2004-02-04 08:55) [7]

Абстрактные методы были придуманы скорее всего для того, что бы избавить от необходимости реализовывать в implementation методы, которые ничего не делают.

Например метод рисования у общего предка.
Сам метод в предке нужен. Что бы полиморфно обрабатывать потомков, но не знает где и что рисовать конкретно.

Поэтому в implementation появляется такая несуразность как пустой метод.

procedure TAbstractClass.Draw;
begin
end;

Но вот придумали абстрактные методы и эту несуразность можно убрать из секции.


 
Denisac   (2004-02-04 08:59) [8]

Блин... Т.е через родителя? Вот тут и есть проблема...
Вот:
Фигура=сlass
{Something}
procedure Draw(x,y:integer);abstract;
end;
Круг=Фигура
{Something}
procedure Draw(x,y:integer);{overload?}
end;
Вот... И мы пишем метод Draw для круга(т.е. как рисовать), а для чего абстракция?
Объясните пожалуйста, мне этот вопрос спокойно спать не даёт.


 
Denisac   (2004-02-04 09:01) [9]

Ведб можно же было и не делать всякой абстракции если мы в потомке всёравно перекрываем метод...


 
Beat ©   (2004-02-04 09:02) [10]

Да абстрактный метод может вызвать объект РОДИТЕЛЬ - например тот же Draw, например когда поменялось общее для всех потомков свойство.


 
Dimka Maslov ©   (2004-02-04 09:06) [11]

Наследование бывает двух видов - наследование поведения (реалищации) и наследование объявления (интерфейса). В первом случае класс-предок предоставляет некую функциональность, которая может быть изменена или расширена в потомках. Во втором же случае предок предоставляет потомкам лишь общий набор методов, позволяющий ко всем объектам, принадлежащим классам-потомкам обращаться как к классу-предку. А вот уже реализация этих методов может быть различной. Самый простой пример - класс TStrings, имеющий много абстрактных методов для доступа к строкам. От этого класса унаследованы и TStringList, и TListItems, и TMemoLines, что позволяет работать одинаково со всеми объектами как с объектами TStrings, не вдаваясь в подробности реализации. А вообще прочитай всё-таки книги по ООП Это не помешает и избавит окружающий от многих вопросов


 
Anatoly Podgoretsky ©   (2004-02-04 09:07) [12]

Denisac (04.02.04 09:01) [9]
Для удобства, посколько можно оперировать классаом фигура, а не делать разборку какой это класс и какой метод вызывать, а если наслединик, что тогда делать будешь, переделывать программу, а так просто.

Фигура.Draw и все, фигура сама нарисуется, именно фигура, а не круг, квадрат. Это и есть абстрагирование.


 
Reindeer Moss Eater ©   (2004-02-04 09:09) [13]

Еще раз.
Абстрактные методы - это методы, не требующие реализации в секции реализации.

Если ваш метод в классе ничего не делает (не имеет возможности делать ввиду отсутствия конкретики) - то этот метод - кандидат на то, что бы стать абстрактным.

Все.


 
Beat ©   (2004-02-04 09:15) [14]

По крупице истины к вечному счатью...


 
Семен Сорокин ©   (2004-02-04 09:34) [15]

TFigure = class
protected
procedure Draw(x,y:integer); abstract;
end;

TCircle = class(TFigure)
protected
procedure Draw(x,y:integer); override;
end;

TSquare = class(TFigure)
protected
procedure Draw(x,y:integer); override;
end;

...
var
_i: integer;
_figures : array [0..1] of TFigure;

_figures[0] := TCircle.Create;
_figures[1] := TSquare.Create;

а теперь читаем Anatoly Podgoretsky © (04.02.04 09:07) [12]
можем вызвать
for _i := 0 to 1 do
_figures[_i].Draw(0, 0);

для каждого класса отработает свой метод.
и как сказал Reindeer Moss Eater © (04.02.04 08:55) [7] используется abstract в том случае если в базовом классе нет никакой обработки по этому методу, чтобы не загромождать пустышкой implementatopn-секцию


 
Beat ©   (2004-02-04 09:36) [16]

САМОЕ ГЛАВНОЕ ПОВТОРЮ:
...абстрактный метод может вызвать объект РОДИТЕЛЬ из прайвет метода - например тот же Draw, например когда поменялось общее для всех потомков свойство.


 
Reindeer Moss Eater ©   (2004-02-04 09:39) [17]

Только не в этой жизни и не в этой галактике


 
Beat ©   (2004-02-04 09:45) [18]

А так:

class TFigure
{
private:
void hehe(void) { Draw(); };
protected:
virtual void Draw(void) = NULL;
};

clas TCircle : public TFigure
{
virtual void Draw(void) { ... };
};


 
Reindeer Moss Eater ©   (2004-02-04 09:46) [19]

Только не в этой жизни и не в этой галактике

Добавлю:
Еще к тому же и не в этом языке и не в этом компиляторе.


 
Beat ©   (2004-02-04 09:47) [20]

ЧИтай выше


 
Reindeer Moss Eater ©   (2004-02-04 09:49) [21]

ЧИтай выше

Иди дальше


 
Denisac   (2004-02-04 09:50) [22]

Во!!! Спасибо Вроде Понял!!!


 
Beat ©   (2004-02-04 09:52) [23]

Грубить не надо... :(((

Если ты об этом:

TFigure = class
private
proecdure Hehe;
protected
procedure Draw(x,y:integer); abstract;
end;

TCircle = class(TFigure)
protected
procedure Draw(x,y:integer); override;
end;

procedure TFigure.Hehe;
begin
Draw;
end;


 
Reindeer Moss Eater ©   (2004-02-04 09:56) [24]

Да абстрактный метод может вызвать объект РОДИТЕЛЬ - например тот же Draw, например когда поменялось общее для всех потомков свойство.

Ну и где в [23] абстрактный метод вызывает какие-то там объекты ?


 
Семен Сорокин ©   (2004-02-04 09:57) [25]

Beat © (04.02.04 09:52) [23]
а что здесь необычного, что выделяет абстрактный метод?


 
Beat ©   (2004-02-04 10:00) [26]

Господа, вы неправильно меня поняли:
...объект РОДИТЕЛЬ из прайвет метода может вызвать абстрактный метод - например тот же Draw, например когда поменялось общее для всех потомков свойство.


 
Beat ©   (2004-02-04 10:02) [27]

Да то, что в базовом (абстрактном) классе определяется поведение - например движение - а наследниках только отрисовка.


 
Reindeer Moss Eater ©   (2004-02-04 10:03) [28]

Ты покажи пальцем где абстрактый метод что-то там вызывает и главное расскажи как он при этом продолжает оставаться абстрактным.


 
Семен Сорокин ©   (2004-02-04 10:05) [29]

Beat © (04.02.04 10:00) [26]
...объект РОДИТЕЛЬ из прайвет метода может вызвать абстрактный метод - например тот же Draw, например когда поменялось общее для всех потомков свойство.

я все никак не пойму.
а любой другой метод он не может вызвать?


 
Beat ©   (2004-02-04 10:05) [30]

ЧИтай выше

ЧИтай выше

ЧИтай выше


 
Reindeer Moss Eater ©   (2004-02-04 10:05) [31]

Господа, вы неправильно меня поняли:
...объект РОДИТЕЛЬ из прайвет метода может вызвать абстрактный метод - например тот же Draw, например когда поменялось общее для всех потомков свойство.


Ни разу в жизни он его не вызывает.
При диспетчеризации динамических методов вызывается метод потомка, который ни разу не абстрактный.


 
Beat ©   (2004-02-04 10:06) [32]

Да не абстрактный, а наследуемый, у объекта потомка.

з.ы. ты цепляешься к словам или я не понятно объясняю???


 
Reindeer Moss Eater ©   (2004-02-04 10:07) [33]

Beat © (04.02.04 10:05) [30]
ЧИтай выше

ЧИтай выше

ЧИтай выше


А ты читай букварь (объектную модель Object Pascal)


 
Beat ©   (2004-02-04 10:08) [34]

ЧИтай выше :))))))))))))))


 
Reindeer Moss Eater ©   (2004-02-04 10:08) [35]

Да не абстрактный, а наследуемый, у объекта потомка.

з.ы. ты цепляешься к словам или я не понятно объясняю???


Ты объясняешь не непонятно.
Ты объясняешь неправильно.


 
Beat ©   (2004-02-04 10:11) [36]

И в чем непрвильно???

метод "hehe" вызывает "Draw", того потомка который наследует - это, что неправильно???


 
Семен Сорокин ©   (2004-02-04 10:15) [37]

Beat © (04.02.04 10:11) [36]
И в чем непрвильно???

метод "hehe" вызывает "Draw", того потомка который наследует - это, что неправильно???

тут все ясно, непонятно почему, с твоих слов, это является "особенностью абстрактного метода".


 
Reindeer Moss Eater ©   (2004-02-04 10:15) [38]

И в чем непрвильно???

Читай выше


 
Beat ©   (2004-02-04 10:16) [39]

встречный вопрос: а что ты понимаешь под "особенностью"???


 
Beat ©   (2004-02-04 10:17) [40]

Reindeer Moss Eater:
goto [36]

утомил...


 
Reindeer Moss Eater ©   (2004-02-04 10:19) [41]

встречный вопрос: а что ты понимаешь под "особенностью"???

Он хотел понять особенность абстрактных методов, красочно описанную тобой в [16]


 
Семен Сорокин ©   (2004-02-04 10:20) [42]

Beat © (04.02.04 10:16) [39]
встречный вопрос: а что ты понимаешь под "особенностью"???

вопрос изначально звучал так: Объясните пожалуйста, в чём смысл абстрактных классов???


 
Reindeer Moss Eater ©   (2004-02-04 10:20) [43]

утомил...

Иди дальше.


 
Beat ©   (2004-02-04 10:24) [44]

Смысл в определении ряда общих свойств и методов у базового класса, и создании абстрактных методов - тех что не реализованы в родителеи наследуются и определяются у потомка, для вариации поведения...

з.ы. я тороплюсь и, может, плохо объясняю, сори :(

Reindeer Moss Eater:
:((( повторяешься :((((((((((((((


 
Reindeer Moss Eater ©   (2004-02-04 10:27) [45]

Смысл в определении ряда общих свойств и методов у базового класса, и создании абстрактных методов - тех что не реализованы в родителеи наследуются и определяются у потомка, для вариации поведения...

Наследуются ВСЕ методы и свойства, а не только абстрактные.
Переопрределяются ВСЕ ДИНАМИЧЕСКИЕ методы, а не только абстрактные.

з.ы. я тороплюсь и, может, плохо объясняю, сори :(

Повторюсь еще раз:
Ты неправильно объясняешь, а не просто плохо.


 
Семен Сорокин ©   (2004-02-04 10:27) [46]

Beat © (04.02.04 10:24) [44]
а-а-а, ты это имеешь ввиду... :))
предполагалось что это было известно автору вопроса см. Denisac (04.02.04 08:38) [5]


 
Beat ©   (2004-02-04 10:32) [47]

Reindeer Moss Eater:
я что описал как динамический (виртуальный метод) Hehe???

ТЫ НЕПРАВИЛЬНО ЧИТАЕШЬ, возьми БУКВАРЬ


 
Плохиш   (2004-02-04 10:39) [48]

Какое длинное обсуждение 8-| А всё потому, что некоторым лень теорию ООП почитать :-( или в современных книжках об этом уже не пищут? :-(


 
Beat ©   (2004-02-04 10:42) [49]

и кто то торопится (впрочем как всегда) ;)))


 
Anatoly Podgoretsky ©   (2004-02-04 12:02) [50]

Beat © (04.02.04 10:24) [44]
Вариация поведения не может меняться, ее просто нет, это абстрактный метод, не реализованый, то есть не существующий. Реализация появится у потомков, вот потомки потомков и смогут менять вариацию поведения.


 
real_dimedrol   (2004-02-04 13:05) [51]

А начиналось все так прозаично: в чем смысл абстрактных классов. А суть была в том, что автор сам не понял, чего спросил. И понеслась...


 
Skier ©   (2004-02-04 14:32) [52]


> Объясните пожалуйста, в чём смысл абстрактных классов???

В полиморфизме.



Страницы: 1 2 вся ветка

Текущий архив: 2004.02.13;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.023 c
1-38851
Натуся
2004-02-01 23:23
2004.02.13
Плюс один месяц


1-38855
valerchik
2004-02-04 09:13
2004.02.13
динамическая загрузка форм


6-38994
Dark Elf
2003-09-10 12:15
2004.02.13
Работа с почтой


1-38921
snake1977
2004-02-04 13:28
2004.02.13
посоветуйте


1-38920
ss300
2004-02-04 13:21
2004.02.13
проверка на цифру