Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Реализация TDataLink у Борланда: непонятки


Ega23 ©   (2005-06-10 13:42:00) 

Вот есть у TDataLink следующие методы:

 protected
   procedure ActiveChanged; virtual;
   procedure UpdateData; virtual;


А зачем они объявлены как virtual, а не как virtual; abstract;?
Ведь их реализация у TDataLink пустая?


Ega23   (2005-06-10 15:12:00) [1]

2 evvcom ©   (10.06.05 14:56) [17]

Я уже понял, спасибо.


evvcom   (2005-06-10 14:56:00) [2]

Посмотри у TQuery:
FDataLink := TQueryDataLink.Create(Self);
в TQueryDataLink ActiveChanged перекрыт, а UpdateData нет. А UpdateData в очень многих местах в TDataLink вызывается. Получается, что в этих классах можно было бы и обойтись без UpdateData. Но где-то (в каких-то других потомках от TDataLink)можно было бы и без ActiveChanged обойтись, а без UpdateData нет.
Эти методы добавляют в базовые классы гибкость без принуждения реализовывать их в потомках в случае ненадобности.


Anatoly Podgoretsky   (2005-06-10 14:54:00) [3]

Ega23 ©   (10.06.05 14:33) [12]
Именно так, поскольку будут дергать и другие абстрактные методы. Это типичный прием.


default   (2005-06-10 14:47:00) [4]

Ega23 ©   (10.06.05 14:33) [12]
да
точнее может быть какой-то метод который в ходе своего выполения обращается к методам ActiveChanged, UpdateData
НО, что самое главное - это метод может что-то делать полезное и без"наполнения" этих методов
если мы бы их абстрактыми сделали, то получили бы abstract error при вызове этого метода, тем самым потрели бы возможность его использвания


Ega23   (2005-06-10 14:43:00) [5]

Ну тогда понятно...


TUser   (2005-06-10 14:37:00) [6]

> Ega23 ©   (10.06.05 14:33) [12]

Это во-первых.
А еще есть Warnings - если написать TStrings.Creae, то мы получим предупреждение, что создаваемый объект содержит абстрактный метод, а если написать TDataLink.Create - то не получим. В Борланде решили, что кому-то может пригодиться использовать объект класса TDataLink, а не его наследника.


Ega23   (2005-06-10 14:33:00) [7]

есть идёт использование только этих методов тогда действительно смысла нет
то есть, для конкретики, может есть смысл вызывать полиморфно метод базового класс который что-то полезное делает и кроме того вызывает эти пустые методы(дабы допустить использование этого метода(который может что-то полезное делать) и без определения этих пустых методов)


а-а-а-а... Вон оно как... Т.е. сам TDataLink в каком-то другом своём методе может дёргать эти пустые методы, предполагая, что их реализация имеется у потомков?


default   (2005-06-10 14:26:00) [8]

Ega23 ©   (10.06.05 14:14) [10]
есть идёт использование только этих методов тогда действительно смысла нет
то есть, для конкретики, может есть смысл вызывать полиморфно метод базового класс который что-то полезное делает и кроме того вызывает эти пустые методы(дабы допустить использование этого метода(который может что-то полезное делать) и без определения этих пустых методов)


Ega23   (2005-06-10 14:14:00) [9]

дать возможнось полиморфного вызова этих методов не только для потомков данного класса, но и для базового класса

ТАК ОНИ В БАЗОВОМ КЛАССЕ ПУСТЫЕ!!!

Вот:

procedure TDataLink.UpdateData;
begin
end;


Я понимаю, если бы у базового класса был какой-то обработчик, его через inherited можно было-бы вызвать. А если он пуст, то нафига его вызывать???? ИМХО, только в том случае, если "генофонд" портить...

не понял:(

ну для виртуального метода в потомке можно override сделать, а можно просто подменить метод (UpdateData:=MyUpdateData;) без потомков.


default   (2005-06-10 14:09:00) [10]

Ega23 ©   (10.06.05 14:01) [8]
" Даже если просто возможность использования, то эти методы придётся не переопределять, а адреса им другие подставлять...."
не понял:(

virtual у методов стоит, очевидно, для того чтобы дать возможнось полиморфного вызова этих методов не только для потомков данного класса, но и для базового класса
видимо, структура базовго класса такова, что это имеет смыслделать


Ega23   (2005-06-10 14:01:00) [11]

Всё равно не понимаю. Даже если просто возможность использования, то эти методы придётся не переопределять, а адреса им другие подставлять....
Нет, не понимаю зачем...


default   (2005-06-10 13:52:00) [12]

Ega23 ©   (10.06.05 13:49) [6]
вопрос не в том используется или инет
а в возможностииспользования


Ega23   (2005-06-10 13:49:00) [13]

Но вот сколько я ни смотрел VCL, я понял, что реально TDataLink не используется напрямую. Используются его наследники TGridDataLink, TFieldDataLink etc.


default   (2005-06-10 13:48:00) [14]

TUser ©   (10.06.05 13:46) [2]
одиинаково мыслим:)


default   (2005-06-10 13:48:00) [15]

[1]
смысл в том, что, видимо, класс TDataLink полноценно может использоваться, в то время как в потомках могут специфицироваться указанные методы
если бы этот класс бы лишькаркасом, тогда бы стоило эти методы сделать абстрактными, показав тем самым что без их спецификации класс юзать незачем


TUser   (2005-06-10 13:46:00) [16]

> Чтобы не было Abstract Error.

Не будет, если не вызывать эти методы.


TUser   (2005-06-10 13:46:00) [17]

Я думаю - чтобы не получать сообщение, что у создаваемого объекта есть абстрактный метод. Т.е. логика такая - там, где Борландцы считают, что объект такого класса создавать не придется (TDataSet, например), а нужны только его наследники - там abstract. Там где может понадобиться и этот класс, и наследники - пыстые методы.

Кроме того, в Борланде много программистов, и стиль у каждого свой.


-=XP=-   (2005-06-10 13:43:00) [18]

Чтобы не было Abstract Error.


Наверх

Титульная страница Поиск, карта сайта Написать письмо