알렉산더의 해결책은 훌륭한 것이지만 특정 상황에서는 충분하지 않습니다. TClassFactory 클래스를 설정하고자 할 때, TClass 참조는 런타임 중에 저장 될 수 있고 나중에 검색되는 임의의 수의 인스턴스를 저장할 수 있습니다.
이러한 클래스 팩토리는 보유한 클래스의 실제 유형에 대해 전혀 알지 못하므로 해당 메타 클래스에 캐스트 할 수 없습니다. 이러한 경우 올바른 생성자를 호출하려면 다음 접근 방식이 효과적입니다.
먼저 간단한 데모 클래스가 필요합니다 (공용 필드는 신경 쓰지 말고 데모 목적으로 만 사용하십시오).
interface
uses
RTTI;
type
THuman = class(TObject)
public
Name: string;
Age: Integer;
constructor Create(); virtual;
end;
implementation
constructor THuman.Create();
begin
Name:= 'John Doe';
Age:= -1;
end;
이제 우리는 순수 RTTI에 의해 올바른 생성자 호출 유형 THuman의 객체를 인스턴스화합니다.
procedure CreateInstance();
var
someclass: TClass;
c: TRttiContext;
t: TRttiType;
v: TValue;
human1, human2, human3: THuman;
begin
someclass:= THuman;
// Invoke RTTI
c:= TRttiContext.Create;
t:= c.GetType(someclass);
// Variant 1a - instantiates a THuman object but calls constructor of TObject
human1:= t.AsInstance.MetaclassType.Create;
// Variant 1b - same result as 1a
human2:= THuman(someclass.Create);
// Variant 2 - works fine
v:= t.GetMethod('Create').Invoke(t.AsInstance.MetaclassType,[]);
human3:= THuman(v.AsObject);
// free RttiContext record (see text below) and the rest
c.Free;
human1.Destroy;
human2.Destroy;
human3.Destroy;
end;
당신은 객체 "human1"와 "human2는"우리가 원하는 것을하지 않은, 즉, 이름 = ''연령별 = 0, 0으로 초기화 된 것을 발견 할 것이다. 대신 human3 개체는 THuman의 생성자에서 제공되는 기본값을 보유합니다.
그러나이 방법을 사용하려면 클래스에 매개 변수가없는 생성자 메서드가 있어야합니다. 위의 모든 것은 나에 의해 잉태되지 않았지만 훌륭하게 그리고 자세히 설명되어 있습니다 (예 : c.Free 부분). Rob Love's Tech Corner.
좋아, 만약 내가 델파이로 일반 개체 팩토리를 구축하고 싶다면 변수에 TMyClass 클래스를 할당해야한다는 것을 알았다면 이것이 가능할 것 같습니다. – mjn
특정 유형의 객체를 생성하려면 클래스 유형 정보가 필요합니다. 클래스 정보가 없으면이 유형의 객체를 생성 할 수 없습니다. 분명히;) – Alex