Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
ВнизРеализация TDataLink у Борланда: непонятки Найти похожие ветки
← →
Ega23 © (2005-06-10 13:42) [0]Вот есть у TDataLink следующие методы:
protected
procedure ActiveChanged; virtual;
procedure UpdateData; virtual;
А зачем они объявлены как virtual, а не как virtual; abstract;?
Ведь их реализация у TDataLink пустая?
← →
-=XP=- © (2005-06-10 13:43) [1]Чтобы не было Abstract Error.
← →
TUser © (2005-06-10 13:46) [2]Я думаю - чтобы не получать сообщение, что у создаваемого объекта есть абстрактный метод. Т.е. логика такая - там, где Борландцы считают, что объект такого класса создавать не придется (TDataSet, например), а нужны только его наследники - там abstract. Там где может понадобиться и этот класс, и наследники - пыстые методы.
Кроме того, в Борланде много программистов, и стиль у каждого свой.
← →
TUser © (2005-06-10 13:46) [3]> Чтобы не было Abstract Error.
Не будет, если не вызывать эти методы.
← →
default © (2005-06-10 13:48) [4][1]
смысл в том, что, видимо, класс TDataLink полноценно может использоваться, в то время как в потомках могут специфицироваться указанные методы
если бы этот класс бы лишь каркасом, тогда бы стоило эти методы сделать абстрактными, показав тем самым что без их спецификации класс юзать незачем
← →
default © (2005-06-10 13:48) [5]TUser © (10.06.05 13:46) [2]
одиинаково мыслим:)
← →
Ega23 © (2005-06-10 13:49) [6]Но вот сколько я ни смотрел VCL, я понял, что реально TDataLink не используется напрямую. Используются его наследники TGridDataLink, TFieldDataLink etc.
← →
default © (2005-06-10 13:52) [7]Ega23 © (10.06.05 13:49) [6]
вопрос не в том используется или инет
а в возможности использования
← →
Ega23 © (2005-06-10 14:01) [8]Всё равно не понимаю. Даже если просто возможность использования, то эти методы придётся не переопределять, а адреса им другие подставлять....
Нет, не понимаю зачем...
← →
default © (2005-06-10 14:09) [9]Ega23 © (10.06.05 14:01) [8]
" Даже если просто возможность использования, то эти методы придётся не переопределять, а адреса им другие подставлять...."
не понял:(
virtual у методов стоит, очевидно, для того чтобы дать возможнось полиморфного вызова этих методов не только для потомков данного класса, но и для базового класса
видимо, структура базовго класса такова, что это имеет смысл делать
← →
Ega23 © (2005-06-10 14:14) [10]дать возможнось полиморфного вызова этих методов не только для потомков данного класса, но и для базового класса
ТАК ОНИ В БАЗОВОМ КЛАССЕ ПУСТЫЕ!!!
Вот:
procedure TDataLink.UpdateData;
begin
end;
Я понимаю, если бы у базового класса был какой-то обработчик, его через inherited можно было-бы вызвать. А если он пуст, то нафига его вызывать???? ИМХО, только в том случае, если "генофонд" портить...
не понял:(
ну для виртуального метода в потомке можно override сделать, а можно просто подменить метод (UpdateData:=MyUpdateData;) без потомков.
← →
default © (2005-06-10 14:26) [11]Ega23 © (10.06.05 14:14) [10]
есть идёт использование только этих методов тогда действительно смысла нет
то есть, для конкретики, может есть смысл вызывать полиморфно метод базового класс который что-то полезное делает и кроме того вызывает эти пустые методы(дабы допустить использование этого метода(который может что-то полезное делать) и без определения этих пустых методов)
← →
Ega23 © (2005-06-10 14:33) [12]есть идёт использование только этих методов тогда действительно смысла нет
то есть, для конкретики, может есть смысл вызывать полиморфно метод базового класс который что-то полезное делает и кроме того вызывает эти пустые методы(дабы допустить использование этого метода(который может что-то полезное делать) и без определения этих пустых методов)
а-а-а-а... Вон оно как... Т.е. сам TDataLink в каком-то другом своём методе может дёргать эти пустые методы, предполагая, что их реализация имеется у потомков?
← →
TUser © (2005-06-10 14:37) [13]> Ega23 © (10.06.05 14:33) [12]
Это во-первых.
А еще есть Warnings - если написать TStrings.Creae, то мы получим предупреждение, что создаваемый объект содержит абстрактный метод, а если написать TDataLink.Create - то не получим. В Борланде решили, что кому-то может пригодиться использовать объект класса TDataLink, а не его наследника.
← →
Ega23 © (2005-06-10 14:43) [14]Ну тогда понятно...
← →
default © (2005-06-10 14:47) [15]Ega23 © (10.06.05 14:33) [12]
да
точнее может быть какой-то метод который в ходе своего выполения обращается к методам ActiveChanged, UpdateData
НО, что самое главное - это метод может что-то делать полезное и без "наполнения" этих методов
если мы бы их абстрактыми сделали, то получили бы abstract error при вызове этого метода, тем самым потрели бы возможность его использвания
← →
Anatoly Podgoretsky © (2005-06-10 14:54) [16]Ega23 © (10.06.05 14:33) [12]
Именно так, поскольку будут дергать и другие абстрактные методы. Это типичный прием.
← →
evvcom © (2005-06-10 14:56) [17]Посмотри у TQuery:
FDataLink := TQueryDataLink.Create(Self);
в TQueryDataLink ActiveChanged перекрыт, а UpdateData нет. А UpdateData в очень многих местах в TDataLink вызывается. Получается, что в этих классах можно было бы и обойтись без UpdateData. Но где-то (в каких-то других потомках от TDataLink)можно было бы и без ActiveChanged обойтись, а без UpdateData нет.
Эти методы добавляют в базовые классы гибкость без принуждения реализовывать их в потомках в случае ненадобности.
← →
Ega23 © (2005-06-10 15:12) [18]2 evvcom © (10.06.05 14:56) [17]
Я уже понял, спасибо.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.034 c