type
TForm72 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TTestForm = class(TForm)
public
constructor CreateTest(AOwner: TComponent); virtual;
end;
TTestForm1 = class(TTestForm)
public
constructor CreateTest(AOwner: TComponent); override;
end;
TTest<T: TTestForm, constructor> = class(TObject)
public
class procedure Test;
end;
var
Form72: TForm72;
implementation
{$R *.dfm}
procedure TForm72.FormCreate(Sender: TObject);
begin
TTest<TTestForm1>.Test;
end;
{ TTest<T> }
class procedure TTest<T>.Test;
var
F: T;
begin
F := T.CreateTest(Application);
Form72.Caption := F.Name;
end;
{ TTestForm }
constructor TTestForm.CreateTest(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
{ TTestForm1 }
constructor TTestForm1.CreateTest(AOwner: TComponent);
begin
inherited;
Caption := 'Bang';
end;
end.
XE2에서 컴파일이 코드를 컴파일하지만 "[DCC32 오류] Unit71.pas (55)와 함께 실패하지 않습니다 이유 : E2010 호환되지 않는 유형 : 'T'와 '절차, 지정되지 않은 포인터 나 형식이 지정되지 않은 매개 변수 ''를 사용합니다. 내가 잘못했거나 컴파일러가 잘못 했어?이 코드는 XE3
답장을 보내 주셔서 감사합니다. 나는 진보에 직면 해있다. 귀하의 수정과 함께 컴파일했습니다. 그러나 액세스 위반으로 실행시 실패합니다. – user1723322
죄송합니다. 나는 잘 집중된 독자가 아니었다. 사실 F : = T (TTestFormClass (T) .CreateTest (Application)); 잘 작동 – user1723322
완료. 발언처럼 -이 유형의 캐스팅 운동은 추한 것 같습니다. 아이디어 제네릭에서는 계량 캐스팅을 피하기 위해 유형 캐스팅을 피할 수있는 방법을 고안했습니다. – user1723322