Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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.009 c
14-93632
Goida
2004-01-08 18:27
2004.01.29
Глюки


1-93447
Незнайка
2004-01-16 12:49
2004.01.29
Как в дельфи перевести:


1-93528
RustamBek
2004-01-19 10:36
2004.01.29
Межстрочный интервал в TRichEdit


4-93732
voe
2003-11-22 03:10
2004.01.29
Запуск exe файла...


1-93484
race1
2004-01-15 17:05
2004.01.29
canvas.textrect





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