Цитата:
Сообщение от lmikle
ну тут надо по другому - либо в родителе метод абстрактрый и реализован в потомках, либо шаблоны/дженерики.
Вариант первый - классическое ООП:
Код:
type
A = class
procedure add( i : integer); virtual; abstract;
end;
B = class(A)
ab : array of integer;
procedure add( i : integer); override;
end;
C = class(A)
ac : array of integer;
procedure add( i : integer); override;
end;
procedure B.add( i : integer); override;
begin
setlength(ab,length(ab)+1);
ab[high(ab)] := i;
end;
procedure C.add( i : integer); override;
begin
setlength(ac,length(ac)+1);
ab[high(ac)] := i;
end;
Вариант второй - generic
Код:
type
class TA<T>
a : array Of T;
procedure Add(i : T);
end;
procedure TA<T>.Add(i : T);
begin
setlength(a,length(a)+1);
a[high(a)] := i;
end;
...
var
b : TA<integer>;
c : TA<int64>;
begin
b := TA<integer>.create;
c := TA<int64>.create;
...
|
Второй вариант мне не очень подходит, так как названия массивов у меня всегда разные, а первый довольно громоздкий, так как у меня оч много однотипных классов.
Вот попробовал таким способом, получаем массив, добавляем, возвращаем массив. Но не работает, out of memory... В чем тут проблема?
Код:
function tm_pathbuild.add_item( obj : tobject; list : array of tobject ): array of tobject;
var
i:integer;
begin
setlength( result, length( list ) + 1 );
for i := 0 to ( high( list ) ) do result[ i ] := list[ i ];
result[ high( result ) ] := obj;
end;