Главная страница
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]

утомил...



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

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

Наверх




Память: 0.56 MB
Время: 0.035 c
1-38780
staryx
2004-02-03 16:21
2004.02.13
WML 1.1


3-38696
sohat
2004-01-22 09:01
2004.02.13
ADO для Firebird ?


14-39009
NewD
2004-01-27 07:04
2004.02.13
Подскажите пож-та ссылrи на статьи про Tlistview .


1-38895
Agrar
2004-02-04 10:22
2004.02.13
Вопрос по поводу текстового редактора?


11-38761
BelchonokH
2003-06-01 18:49
2004.02.13
А как создать RichEdit в runtime на пэйдже TabControl a