![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Подскажите как сделать чтобы наследуемый метод add добавлял элемент в конец именно массива внутри класса, который его вызывает?
Код:
unit test;
interface
type
a = class( tobject )
public
procedure add( i : integer; xy: pointer);
end;
b = class( a )
public
x : array of integer;
end;
c = class( a )
public
y : array of integer;
end;
implementation
procedure a.add( i : integer; xy: pointer);
begin
setlength( @xy, length( @xy ) + 1 ); //ругается на xy
self.xy[ length( self.xy ) - 1 ] := i;
end;
var
my_b: b;
my_c: c;
begin
my_b := b.create;
my_c := c.create;
my_b.add(123, @my_b.x); //Нужно добавить 123 в массив x
my_c.add(456, @my_b.y); //Нужно добавить 456 в массив y
end.Последний раз редактировалось kenshi245, 19.06.2017 в 19:49. |
|
#2
|
|||
|
|||
|
ну тут надо по другому - либо в родителе метод абстрактрый и реализован в потомках, либо шаблоны/дженерики.
Вариант первый - классическое ООП: Код:
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;
... |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
kenshi245 (20.06.2017)
| ||
|
#3
|
|||
|
|||
|
Цитата:
Второй вариант мне не очень подходит, так как названия массивов у меня всегда разные, а первый довольно громоздкий, так как у меня оч много однотипных классов. Вот попробовал таким способом, получаем массив, добавляем, возвращаем массив. Но не работает, 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; |
|
#4
|
|||
|
|||
|
А может просто тогда перейти на контейнеры типа TList и TObjectList? Они изначально являются указателями.
|