Форум: "Потрепаться";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
ВнизTStrings - странный клас какой-то Найти похожие ветки
← →
Teren (2004-01-02 01:51) [0]Вроде как TStrings это класс. Тогда почему к элементам, которые он хранит можно обращаться запросто вот так Strings1[i]?
Это ведь неправильно!
По идее, если Strings1: array of TStrings;
тогда как раз можно обращаться Strings1[i]...
И главное, в коде TStrings не поймешь - как они так сделали, что можно обращаться к классу, как к массиву...
← →
Undert (2004-01-02 01:56) [1]
> Teren
Читай хелп по Property
← →
Teren (2004-01-02 01:58) [2]Причем здесь Property ?!
← →
raidan (2004-01-02 01:59) [3]Поверь мне, все очень просто :)))
Обрати внимание на скромное слово default; после property strings[index:integer] что-то-там-еще...
Это скромное слово говорит о том, что свойство strings[index:integer] является свойством по-умолчанию и его не обязательно писать после точки. Написание strings[1] эквивалентно strings1.strings[1] :)
О как.
← →
Teren (2004-01-02 01:59) [4]Причем здесь Property ?!
← →
Teren (2004-01-02 02:01) [5]а-а-а... понятно
← →
raidan (2004-01-02 02:02) [6]Балда.
Читай исходники, там все есть.
И исходники класса TStrings там тоже есть.
Если не втыкаешь, купи книжку.
Если книжка не поможет, то это клинический случай.
Сорри, но, мля :((
Причем здесь propery...
Да просто так...
Тусуются тут эти проперти понимаешь-ли...
← →
raidan (2004-01-02 02:03) [7]Сорри :)
Наорал :)
Зря :)
← →
ИМХО (2004-01-02 02:38) [8]У тебя такое часто? ;)
← →
raidan (2004-01-02 04:10) [9]Нет. Только когда кто-то не понимает, ему объясняют, а он не понимает, понимаешь ли :)
Или это я ошибочно думаю, что не понимает :)
В общем, ишо раз сорри :)
← →
Teren (2004-01-02 14:32) [10]1) А что будет если так:
TMyClass = class
private
FSome: TMyClass;
public
property Some: TMyClass read FSome write FSome; default;
end;
Тогда если MyClass1: TMyClass, то
при обращении к MyClass1:= TMyClass(Pnt)
что произойдет?
2) В TStrings есть абстрактные методы - Put, Get. Почему тогда можно создать экземпляр класса TStrings?
← →
SPeller (2004-01-02 14:46) [11]
> А что будет если так:
Ничего необычного. А что ты хотел получить?
> что произойдет?
Преобразование типов. Переменная Pnt преобразуется к типу TMyClass.
← →
Teren (2004-01-02 14:59) [12]SPeller
ты не понял. Ведь получится, что MyClass1 имеет тип TMyClass, и его свойство по умолчанию (к которому можно обращаться просто по имени экземпляра класса) тоже имеет тип TMyClass!
К чему произойдет обращение тогда, к MyClass1 как к экземпляру класса или к MyClass1.Some? Вот в чем вопрос!
← →
Palladin (2004-01-02 22:42) [13]
> Teren (02.01.04 14:59) [12]
Ты откомпилировать пробовал прежде чем спрашивать.
Заканчивай дурью маятся и иди учи матчасть.
← →
Teren (2004-01-02 22:56) [14]>Palladin © (02.01.04 22:42) [13]
А-а-а! Свойство по умолчанию должно быть массивом! Тогда да, никакой путаницы с экземпляром класса не будет! Если MyClass1 значит к самому классу обращаются, а если MyClass1[i] - то значит к свойству класса по умолчанию! Верно?
← →
Stilgar (2004-01-02 23:08) [15]Palladin имеет в ввиду, что свойством по умолчанию может быть только массив (см. Тейкстеру и Пачеко).
> 2) В TStrings есть абстрактные методы - Put, Get. Почему
> тогда можно создать экземпляр класса TStrings?
Создать класс можно. Пользоватся нельзя.
← →
Teren (2004-01-02 23:17) [16]А я думал, что создавать абстрактные классы нельзя! Ведь для этого и есть ключевое слово abstract - показывает методы, которые должны быть обязательно быть перекрыты в наследниках. А вот от наследников уже можно создавать экземпляры. Разве не так?
>Создать класс можно. Пользоватся нельзя
как это?
← →
Fantasist (2004-01-02 23:32) [17]
> Пользоватся нельзя.
Пользовать тоже можно, в каком-то смысле. Вызывать абстрактные методы нельзя.
← →
kaif (2004-01-03 00:52) [18]Абстрактных классов нет. Есть абстрактные методы. И классы, у которых большинство методов абстрактные, часто называют абстрактными классами (например, TDataSet). Но это нестрогий способ говорить. Абстрактный метод можно добавить к любому классу. Если я добавлю абстрактный метод к потомку класса TButton, это не значит, что я не смогу больше создавать экземляры такого класса. Просто я не смогу вызывать этот метод на этом уровне, так как у него пока нет реализации.
← →
Teren (2004-01-03 00:58) [19]Блин, ну я ведь точно где-то читал! Какие-то классы нельзя создать - можно только создать их потомков... что это за классы тогда?! Я думал абстрактные
← →
default (2004-01-03 01:17) [20]"Какие-то классы нельзя создать - можно только создать их потомков... что это за классы тогда?! "
создаются не классы, а объекты(экземпляры классов)
а создавать можно любые объекты, другое дело что в этом нет смысла(типа TStrings)
"Я думал абстрактные"
в принципе не обязательно, так как можно описать класс у которого все или часть методов будут "пустыми"(ничего не делают) и создавать такой объект может тоже не иметь смысла(в нём не описана нужная функциональность)
← →
Teren (2004-01-03 14:09) [21]>другое дело что в этом нет смысла(типа TStrings)
как это нет смысла? Вот свойство TListBox.Items имеет тип TStrings!
← →
Vuk (2004-01-03 14:15) [22]to Teren:
>Вот свойство TListBox.Items имеет тип TStrings!
А если посмотреть ListBox.Items.ClassName? :o)
← →
default (2004-01-03 17:34) [23]Teren (03.01.04 14:09) [21]
это формально, реально же создаётся TStringList, подумай для чего так сделано
← →
Teren (2004-01-03 18:24) [24]>А если посмотреть ListBox.Items.ClassName? :o)
TListBoxStrings... а почему ?! Как это? Ведь сказано
property Items: TStrings read FItems write SetItems;
P.S. Шаманы...
← →
Sandman25 (2004-01-03 18:29) [25][24] Teren (03.01.04 18:24)
Из той же оперы:
в обработчиках, например, кнопки в роли Sender выступает кнопка (тип TButton), а не TObject, как описано в методе. И ничего, работает :)
← →
Teren (2004-01-03 18:34) [26]Ну правильно, ибо TObject и TButton это обычные Pointer
И можно написать TButton(Sender)
← →
Sandman25 (2004-01-03 18:47) [27][26] Teren (03.01.04 18:34)
Вот и со Strings можно так же: TStrings(ListBox.Items)
← →
Vuk (2004-01-03 19:07) [28]>P.S. Шаманы...
Неа. Полиморфизм.
← →
Teren (2004-01-04 00:36) [29]Подождите, я ничего не понял.
>TStrings(ListBox.Items)
нафига...бр-р-р... объясните мне одно. Ведь в описании четко написано:
property Items: TStrings
Каким образом тогда Items стала неким TListBoxStrings? И где этот TListBoxStrings описан вообще?
← →
Sergey_Masloff (2004-01-04 00:41) [30]Teren (04.01.04 00:36) [29]
А чего тут понимать? TStrings абстрактный класс реализующий некий интерфейс (не путать с COM-интерфейсами) работы со списком(собственно говоря массивом) строк. Экземпляр TStrings как таковой не создается а создается один из его потомков которые реализует методы описаные в TStrings и управляет памятью выделяемой для хранения элементов. Одним из таких потомков и является TListBoxStrings. Items стала TListBoxStrings-ом в конструкторе. Открой исходник да посмотри - проблем-то. Благодаря пиратам с доступом к исходникам VCL проблем в России нет. Что может и плохо - так как к бесплатному и отнощение... соответствующее. Впрочем, это я отвлекся.
← →
Teren (2004-01-04 01:26) [31]А почему бы тогда сразу не сделать
Items: TListBoxStrings ?
← →
default (2004-01-04 02:01) [32]Teren (04.01.04 01:26) [31]
а вот тут собаку зарыли
← →
Teren (2004-01-04 14:46) [33]НУ блин и расскажите секрет! Или намекните что ли...
← →
Sergey_Masloff (2004-01-04 15:07) [34]>НУ блин и расскажите секрет! Или намекните что ли...
Прочти книжку. Ну ты ж не станешь просить чтобы тебе объяснили как вычислить интеграл не изучив элементарной арифметики. Тут та же история ну скажут тебе почему в этом частном случае так - и что толку?
← →
Anatoly Podgoretsky (2004-01-04 15:10) [35]Намек, это чтобы было совместимо с любыми наследниками от TStrings
← →
Teren (2004-01-05 16:25) [36]>Намек, это чтобы было совместимо с любыми наследниками от TStrings
Чтобы удобнее было делать наследника от TListBox? Чтобы можно было использовать любой тип в Items, хоть наследника TListBoxStrings, хоть наследника от TStrings, верно?
← →
Vuk (2004-01-05 16:53) [37]to Teren:
Для того, чтобы можно было написать, например, так:
ListBox.Items := Memo.Lines;
← →
default (2004-01-05 16:56) [38]Vuk © (05.01.04 16:53) [37]
если бы Items-ы обоих классов имели тип TStringList например так тоже можно было бы сделать...не лучший пример
← →
Anatoly Podgoretsky (2004-01-05 17:06) [39]Пример как раз правильный и наверно лучший
А в твоем варианте, например можно будет присвоить это, нельзя будет присвоить strings
← →
default (2004-01-05 17:20) [40]"Пример как раз правильный и наверно лучший"
лучший был бы если бы справа от присвоения стоял наследник TStrings(в явном виде)
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.013 c