목록이 TList<TForm>
입니다. 나는 그것을 캐스팅 할 필요가 있으며이 같은 TList<TObject>
로 사용TList에 TList <T:class>을 캐스팅합니다. <W:class>
procedure mainForm.testCast;
var
listT: TList<TForm>;
listW: TList<TObject>;
obj: TObject;
begin
listT := TList<TForm>.create;
listT.add(form1);
listT.add(form2);
listW := TList<TObject>(listT); // Casting is OK
// This works, but is this fine?
for obj in listW do
memo1.lines.add(obj.className);
end;
샘플은 예상대로 작동하지만 일반적인 목록 사이에 다음과 같이 캐스팅 할 수 괜찮아? 이로 인해 데이터 구조가 손상 될 수 있습니까? 루핑 (DoGetEnumerator
) 목적과 일부 문자열 검사 즉 항목을 추가/제거하지 않기 위해서만 사용합니다.
실제 기능은 조금 더 복잡합니다. TValue
에서 RTTI를 사용하여 listT
에 대한 참조를 얻습니다. 주요 목표는 FMX.Forms
을 내 유닛에 연결하는 것이 아닙니다.
업데이트 : Why are TGeneric<Base> and TGeneric<Descendant> incompatible types?
괜찮 으면 작동하지만 조금 스케치입니다. 어쨌든 여기 캐스트를 사용해야 할 것 같지 않습니다. RTTI를 통해 열거 자에 연결할 수 있습니다. –
'TForm'은'TObject'에서 파생되었고'TList'는 타입이 지정된 포인터의 일반적인 목록이므로 아무 것도 잘못되었습니다. 즉, 기본 클래스의 메서드를 사용합니다. –
@LURD 나는 그것이 옳다고 생각하지 않는다. 'TList'은'TList '의 기본 클래스가 아닙니다. 'TList 은 TList '은'False'로 평가됩니다. 공통베이스는'TList '입니다. 그것에 대해 생각할 또 다른 방법. 기본 클래스의 메서드를 사용했다면 왜 캐스트가 필요할까요? –