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

Вниз

TStrings & TStringList   Найти похожие ветки 

 
Avsam ©   (2003-05-28 17:48) [0]

Тут коллега пишет так:

var
S: TStrings;
begin
S := TStringList.Create;
.......

Объясняю, что это неверно, а вот почему, не могу его убедить.
Ошибки не возникает. Все работает.
В чем же дело все-таки?


 
Skier ©   (2003-05-28 17:49) [1]

>Avsam © (28.05.03 17:48)

> Объясняю, что это неверно, а вот почему, не могу его убедить.

Это верно !


 
MBo ©   (2003-05-28 17:50) [2]

Это верно. Можно создать любого наследника объявленного типа.


 
avsam ©   (2003-05-28 17:51) [3]

Переменная типа TStrings, а объявляем ее как TStringList.
Что ж тут верного?
Или это просто стиль плохой?


 
Skier ©   (2003-05-28 17:52) [4]


> Переменная типа TStrings, а объявляем ее как TStringList.

И что ?
TStringList = class(TStrings)
TStringList реализует "абстрактный" класс TStrings


 
Юрий Федоров ©   (2003-05-28 17:53) [5]

TStrings нельзя создавать - абстрактный класс


 
Serginio   (2003-05-28 18:01) [6]

Все верно. Если на этапе программирования тебе неизвестно какой и наслетников TStrings ты будешь использовать (их порядка 10). Тоже относится и TStream, TDataSet итд методы которых объявлены абстрактными и перекрываются в наследниках.


 
Юрий Зотов ©   (2003-05-28 18:02) [7]

> avsam © (28.05.03 17:51)

Вы неправы. Так делать не только можно, но и в ряде случаев именно так и нужно делать потому что именно это и будет хорошим, грамотным стилем.

Посмотрите, например, исходники TMemo, TListBox и других компонентов, содержащих свойства TStrings. Ведь там реально создаются совсем другие классы, но все они - TStrings.


 
Anatoly Podgoretsky ©   (2003-05-28 18:22) [8]

Avsam © (28.05.03 17:48)
У тебя умный коллега.


 
default ©   (2003-05-28 19:58) [9]

avsam © (28.05.03 17:51)
почему неверно?
ты просто не знаешь как вызываются виртуальные, статические...
происходит обращение к свойствам на низком уровне(открой окно CPU там всё увидишь)
там же без разницы...
главно есть указатель на объект...
конструктор TStringList-а создаст VMT именно для этого класса
но вот явно(без приведения типа TStringList(Obj)) компилятор тебе не даст использовать новые методы, поля и тд экземпляра TStringList так как есть объявления Obj: TStrings...
а вот абстр-ый класс создавать вообще не обязательно дык он и написано как шаблон(каркас) для потомков и только для них
а самостоятельно он ничто


 
default ©   (2003-05-28 22:58) [10]

"конструктор TStringList-а создаст VMT именно для этого класса"
здесь конечно я поспешил, конструктор не создаёт VMT(VMT одна на каждый класс(содер-ий вир-ые или(и) дин-ие методы)) он инициализирует поле-адрес VMT
это принципиально поэтому и поправился


 
evvcom ©   (2003-05-29 01:03) [11]

Судя по объявлению, это начало какой-то процедуры/функции. Обычно для функции понятно, объект какого класса программист собирается создавать, поэтому чаще всего, чтобы было более наглядно, лучше объявлять то, что нужно, т.е. в данном случае TStringList. В этом случае программисту будут доступны без лишних приведений типов вызовы, объявленные в TStringList, такие как CustomSort, Find и др. Но допускаются и объявления TStrings, и даже TObject. Дело в том, что если мы будем обращаться к методам/свойствам/событиям объекта TStringList как объекта TObject, то не будет никакой ошибки, т.к. все они унаследованы от TObject (например, ClassInfo, ClassName, ClassParent, FieldAddress и др.).
А вот наоборот не прокатит. Т.е. если объявим var ObjStrList: TStringList; и попробуем потом ObjStrList := TObject.Create, то компилятор заругается. Ну нет в TObject методов Add, Clear и других, объявленных в потомках TObject.



Страницы: 1 вся ветка

Текущий архив: 2003.06.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
14-26729
Basic
2003-05-07 00:24
2003.06.09
О наболевшем, хочется пользоваться этим сайтом


1-26463
Junior
2003-05-29 10:03
2003.06.09
Вопрос про *.dcu


7-26821
Some1
2003-04-01 10:08
2003.06.09
Дискета


1-26469
Rise
2003-05-29 12:57
2003.06.09
Invalid pointer operation


14-26708
cyborg
2003-05-21 17:06
2003.06.09
Что за фигня с сервером?