Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Вниз

входящый параметр   Найти похожие ветки 

 
Suvit   (2005-01-20 12:42) [0]

написал процедуру

procedure Shuffle(var List:TList);
var i : Integer;
begin
 Randomize;
 for i := List.Count -1 downto 0 do
   List.Exchange(i, Random(i+1));
end;

теперь хочется прикрутить ее к TInterfaceList
но так как он не унаследован от TList у меня не получается.
поскажите как мне переделать параметр у процедуры, чтобы она могда принимать объекты класса TList,TObjectList, TInterfaceList
ЗЫ: стоит ли вызывать Randomize каждый раз или достаточно 1 раза


 
Александр Иванов ©   (2005-01-20 12:48) [1]

Randomize достаточно вызывать один раз. А параметр можно сделать типа TObject.


 
Sandman25 ©   (2005-01-20 12:56) [2]

var лучше убрать.
можно сделать несколько версий с overload


 
Suvit   (2005-01-20 12:57) [3]


> А параметр можно сделать типа TObject.

но у TObject нету Count Exchange


 
Suvit   (2005-01-20 12:59) [4]


> var лучше убрать.

Объясните, пожайлуста, почему?


 
Sandman25 ©   (2005-01-20 13:06) [5]

[4] Suvit   (20.01.05 12:59)

List - это уже ссылка. Использование указателя на указатель на класс приводит к замедлению работы.


 
ЮЮ ©   (2005-01-20 13:06) [6]

Чтобы не было соблазна убить переданный в качестве параметра объект и вместо него создать новый


 
Suvit   (2005-01-20 13:18) [7]

2 Sandman25,ЮЮ,Александр Иванов спасибо
----
Но все таки можно ли обойтись без overload, код ведь будет одинаковый


 
Sandman25 ©   (2005-01-20 13:22) [8]

List: TObject;

..
if List is TList then
 TList(List).Exchange // работает и для TObjectList
else
 if List is TInterfaceList then
   TInterfaceList(List).Exchange


 
Suvit   (2005-01-20 13:39) [9]


> if List is TList then
>  TList(List).Exchange // работает и для TObjectList
> else
>  if List is TInterfaceList then
>    TInterfaceList(List).Exchange

хм, а если у меня еще будут какие нибудь листы другие.

вот я имею List , как мне узнать класс этого объекта, а потом взять метод этого класса, и запустить для моего объекта, или так в Делфи никто не делает?


 
Sandman25 ©   (2005-01-20 13:46) [10]

[9] Suvit   (20.01.05 13:39)

Если хотите без проверок, можно воспользоваться паттерном адаптер.
Делаете базовый класс, описываете у него метод Exchange и пр.
Пишите 2 наследников, в одном  агрегируете TList, в другом TInterfaceList, соответственно описываете метод Exchange.
В клиентском коде создаете нужный тип класс. И передаете его в Shuffle.
При необходимости добавления нового класса код Shuffle не меняется, надо только определить нового наследника базового класса.


 
Suvit   (2005-01-20 13:53) [11]

я newbie в Delphi, т.е. как-то так,

type
 TAdapterList = Class
   procedure Exchange; virtual;
 TMyList = Class (TAdapter, TList);
 TMyInterfaceList = Class( TAdapder, TInterfaceList);

 procedure Shuffle( List: TAdapterList);
...


 
Sandman25 ©   (2005-01-20 14:23) [12]

[11] Suvit   (20.01.05 13:53)

Да, идею поняли верно.


 
Suvit   (2005-01-20 14:47) [13]

2 Sandman25: спасибо огромное, буду разбираться дальше,
хочу разобраться с всякими virtual; override; dynamic;

ЗЫ: Зря я начал изучать программирование с языков высшего уровня :))


 
Sandman25 ©   (2005-01-20 14:50) [14]

[13] Suvit   (20.01.05 14:47)

abstract не забудьте :)
Удачи!

PS. Если бы начинали не с высокого, все могло бы закочниться потерей интереса к программированию.


 
Suvit   (2005-01-20 14:55) [15]

И еще, а все таки, я нашел у TObject метод MethodAddress
т.е. можно получить адресс для Exchange
остается только его вызвать.

Вопрос:
можно ли объявить переменую с типом какой-нибудь проседуры,
связать ее с адресcом и вызвать ее.


 
Sandman25 ©   (2005-01-20 15:07) [16]

[15] Suvit   (20.01.05 14:55)

Метод должен быть в разделе published. То есть все равно придется писать наследников.


 
Amoeba ©   (2005-01-20 15:21) [17]


> TMyInterfaceList = Class( TAdapder, TInterfaceList);

Такое объявление класса не пройдет! Множественного наследования в ObjectPascal/Delphi нет.


 
Suvit   (2005-01-20 15:25) [18]


> Такое объявление класса не пройдет! Множественного наследования
> в ObjectPascal/Delphi нет.

а это тогда что?
 TInterfaceList = class(TInterfacedObject, IInterfaceList)


 
Digitman ©   (2005-01-20 15:28) [19]


> теперь хочется прикрутить ее к TInterfaceList


нафига ? чем вызван и чем оправдан твой интерес к этому классу ?

imho, с учетом "newbie в Delphi" ты погрязнешь в интерфейсах как хавронья в лохани с картофельными очистками ..


 
Digitman ©   (2005-01-20 15:31) [20]


> Suvit   (20.01.05 15:25) [18]
> а это тогда что?
>  TInterfaceList = class(TInterfacedObject, IInterfaceList)


и где ты видишь здесь множественное наследование классов ?


 
Suvit   (2005-01-20 15:33) [21]


> нафига ? чем вызван и чем оправдан твой интерес к этому
> классу ?
>
> imho, с учетом "newbie в Delphi" ты погрязнешь в интерфейсах
> как хавронья в лохани с картофельными очистками ..

просто у меня есть список IXMLNode
загнал его в TList и перемешал ( вызвал Shuffle ),
но как я понял TnterfaceList специально сделал для интерфейсов, вот хотел использовать его


 
Digitman ©   (2005-01-20 15:40) [22]


> Suvit


Вся задача твоего приложения - "месить" элементы списков ? Или таки ты как-то все же намерен работать с интерфейсами, занесенными в тот или иной список ?


> TMyList = Class (TAdapter, TList);


это - твоя отсебячина, предендующая на множ.наследование классов.
и это даже скомпилировано не будет.


 
Suvit   (2005-01-20 15:47) [23]


> это - твоя отсебячина, предендующая на множ.наследование
> классов.
> и это даже скомпилировано не будет.

не будет, а я и не писал код, так примерные слова для понимания друг друга,
Если в делфи все сводится к применению as и is, то буду использовать их.


 
Suvit ©   (2005-01-20 16:08) [24]


> Вся задача твоего приложения - "месить" элементы списков
> ? Или таки ты как-то все же намерен работать с интерфейсами,
> занесенными в тот или иной список ?

 Вы правы, с интерфейсами не буду работать так как не знаю о них ничего.


 
Digitman ©   (2005-01-20 16:20) [25]


> Suvit ©   (20.01.05 16:08) [24]


ну так и не заморачивайся на TInterfaceList .. не зарабатывай себе геморрой без осознанной необходимости ..

эдак можно до умопомрачения усложнить программу, ибо всяких разных наследников у TList - тьма тьмущая, а реально работать (с полным пониманием происходящего) тебе наверняка придется с весьма и весьма небольшим перечнем этих наследников


> с интерфейсами не буду работать


ну как же не будешь-то ?
"у меня есть список IXMLNode" - это разве не твоя фраза ?
ведь откуда-то и для чего-то ты таки получаешь интерфейсы этого класса, не правда ли ? значит таки намерен работать ?


 
Suvit ©   (2005-01-20 16:42) [26]


> ну как же не будешь-то ?
> "у меня есть список IXMLNode" - это разве не твоя фраза
> ?
> ведь откуда-то и для чего-то ты таки получаешь интерфейсы
> этого класса, не правда ли ? значит таки намерен работать
> ?

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



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

Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.034 c
6-1101110557
Yuve
2004-11-22 11:02
2005.02.06
Broadcast


14-1106054001
Ega23
2005-01-18 16:13
2005.02.06
ЛОЛ!!!!!!!


1-1106725259
ShimON
2005-01-26 10:40
2005.02.06
Отследить выход из Windows


1-1106218677
Aleksandr.
2005-01-20 13:57
2005.02.06
Кто-нить в Д2005 с отчетами работал?


3-1104317212
Russko
2004-12-29 13:46
2005.02.06
Связка 2-х баз данных в одном запросе





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