Показать сообщение отдельно
  #3  
Старый 20.06.2017, 12:35
kenshi245 kenshi245 вне форума
Прохожий
 
Регистрация: 08.06.2017
Сообщения: 16
Версия Delphi: Delphi
Репутация: -625
По умолчанию

Цитата:
Сообщение от 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;
Ответить с цитированием