Форум: "Основная";
Текущий архив: 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.53 MB
Время: 0.01 c