Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.044 c
4-1103187490
Павел
2004-12-16 11:58
2005.02.06
WinAPI и IR устройства. Справочник бы...


1-1106228405
Tomkat
2005-01-20 16:40
2005.02.06
Список параметров из INI файла


3-1104328258
_1008_
2004-12-29 16:50
2005.02.06
Скорость экспорта данных


6-1101564578
adagold
2004-11-27 17:09
2005.02.06
Проверка компьютера в сети


14-1106211075
Бар
2005-01-20 11:51
2005.02.06
Существуют ли нормативы трудоемкости по разработке программ?