Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.011 c
3-38673
Vitalik
2004-01-24 16:38
2004.02.13
даты в БД


11-38762
Кладов
2003-05-27 21:47
2004.02.13
Версия 1.74 дождалась своего часа (в смысле моего отпуска)


1-38843
denis24
2004-02-02 17:28
2004.02.13
замена куска строки в memo


14-39024
Romkin
2004-01-27 14:22
2004.02.13
Переворот текста


7-39124
able
2003-11-28 17:45
2004.02.13
Блокировка





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский