Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1117211527
MadAngel
2005-05-27 20:32
2005.07.11
Фильтраци по дате


1-1118666806
Cooler
2005-06-13 16:46
2005.07.11
Блокировка таблицы


1-1118714581
Viktop
2005-06-14 06:03
2005.07.11
Связи таблиц в D9


3-1117091783
mebel
2005-05-26 11:16
2005.07.11
Последний раз! покажите в тексте что я делаю не так?


11-1102443019
lse
2004-12-07 21:10
2005.07.11
шифрование





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