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

Вниз

Реализация 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.213 c
1-1119361374
Alex17
2005-06-21 17:42
2005.07.11
Фаил


3-1117356716
_RusLAN
2005-05-29 12:51
2005.07.11
Firebird Embedded 1.5. Не могу подключиться.


10-1096025999
Леван
2004-09-24 15:39
2005.07.11
Работа с Word


14-1118294705
hooch
2005-06-09 09:25
2005.07.11
вопрос модераторам.


11-1102869559
Boguslaw
2004-12-12 19:39
2005.07.11
KOL IDE again