Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c