![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
входящый параметр [D7, WinXP]
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, код ведь будет одинаковый