Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-26421
deedlit
2003-05-27 14:12
2003.06.09
Как мне развернуть ComboBox?


7-26811
SeNtiMeL
2003-04-02 22:58
2003.06.09
Как программо отключинь винчестер ?


14-26652
Knight
2003-05-23 23:10
2003.06.09
Буржуйские рассылки


1-26572
anti256
2003-05-24 22:39
2003.06.09
Excel


4-26834
Donpager
2003-03-28 20:55
2003.06.09
Как запустить программу от имени другово юзера?





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