Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

входящый параметр [D7, WinXP]


Страницы:   1 2

Suvit ©   (2005-01-20 12:42:00) 

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

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 раза


Suvit   (2005-01-20 16:42:00) [1]


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

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


Digitman   (2005-01-20 16:20:00) [2]


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


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

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


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


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


Suvit   (2005-01-20 16:08:00) [3]


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

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


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


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

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


Digitman   (2005-01-20 15:40:00) [5]


> Suvit


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


> TMyList = Class (TAdapter, TList);


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


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


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

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


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


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


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


Digitman   (2005-01-20 15:28:00) [8]


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


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

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


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


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

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


Amoeba   (2005-01-20 15:21:00) [10]


> TMyInterfaceList = Class( TAdapder, TInterfaceList);

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


Sandman25   (2005-01-20 15:07:00) [11]

[15] Suvit   (20.01.05 14:55)

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


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

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

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


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

[13] Suvit   (20.01.05 14:47)

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

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


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

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

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


Sandman25   (2005-01-20 14:23:00) [15]

[11] Suvit   (20.01.05 13:53)

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


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

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

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

 procedure Shuffle( List: TAdapterList);
...


Sandman25   (2005-01-20 13:46:00) [17]

[9] Suvit   (20.01.05 13:39)

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


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


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

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

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


Sandman25   (2005-01-20 13:22:00) [19]

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:18:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо