program MultiClass;
{$APPTYPE CONSOLE}
uses
SysUtils, Generics.Defaults, Generics.Collections;
type
TPoint2D = class
x, y: integer;
constructor create(x, y: integer);
end;
TPoint3D = class
x, y, z: integer;
constructor create(x, y, z: integer);
end;
TPointSelector = (ePoint2D, ePoint3D);
TPoint2DOrTPoint3D = class
select: TPointSelector;
obj: Pointer;
constructor create(myClass: TPoint2D); overload;
constructor create(myClass: TPoint3D); overload;
constructor create(x, y: integer); overload;
constructor create(x, y, z: integer); overload;
destructor Destroy; override;
end;
Constructor TPoint2D.create(x: integer; y: integer);
begin
self.x := x;
self.y := y;
end;
Constructor TPoint3D.create(x: integer; y: integer; z: integer);
begin
self.x := x;
self.y := y;
self.z := y;
end;
constructor TPoint2DOrTPoint3D.create(x, y: integer);
begin
select := ePoint2D;
obj := TPoint2D.create(x, y);
end;
constructor TPoint2DOrTPoint3D.create(x, y, z: integer);
begin
select := ePoint3D;
obj := TPoint3D.create(x, y, z);
end;
constructor TPoint2DOrTPoint3D.create(myClass: TPoint2D);
begin
select := ePoint2D;
obj := TPoint2D;
end;
constructor TPoint2DOrTPoint3D.create(myClass: TPoint3D);
begin
select := ePoint3D;
obj := TPoint3D;
end;
destructor TPoint2DOrTPoint3D.Destroy;
begin
if assigned(obj) then
case select of
ePoint2D:
TPoint2D(obj).Free;
ePoint3D:
TPoint3D(obj).Free;
end;
end;
procedure Test;
var
PointList: TObjectList<TPoint2DOrTPoint3D>;
I: integer;
Pt: TPoint2DOrTPoint3D;
P3D: TPoint3D;
P2D: TPoint2D;
begin
PointList := TObjectList<TPoint2DOrTPoint3D>.create;
PointList.OwnsObjects := true;
PointList.Add(TPoint2DOrTPoint3D.create(10, 10));
PointList.Add(TPoint2DOrTPoint3D.create(50, 10));
PointList.Add(TPoint2DOrTPoint3D.create(-10, 10, 90));
PointList.Add(TPoint2DOrTPoint3D.create(3, 50, 70));
for Pt in PointList do
begin
case Pt.select of
ePoint2D:
begin
P2D := Pt.obj;
writeln(P2D.x, ' ', P2D.y);
end;
ePoint3D:
begin
P3D := Pt.obj;
writeln(P3D.x, ' ', P3D.y, ' ', P3D.z);
end;
end;
end;
PointList.Destroy;
end;
begin
try
Test;
except
on E: Exception do
writeln(E.ClassName, ': ', E.Message);
end;
readln;
end.
Это может быть немного излишним, но я думал, что это может иметь отношение
программируются в Delphi XE
Я взял на себя смелость переписывание вопрос, чтобы выразить то, что я думаю, что вы просите , Правильно ли я понял? –
Да, переписывание правильное, согласно моим исследованиям, мне нужен TObjectList для хранения разных типов данных внутри одного списка. – user1769184