Текущий архив: 2005.02.06;
Скачать: CL | DM;
Вниз
входящый параметр Найти похожие ветки
← →
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;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.031 c