我希望類類型的函數使用類型轉換。 我有基(TBase),派生(TDer)和類型轉換(TMyType)類。具有類函數的類型轉換
版本:德爾福7
TBase = class;
TDer = class;
TMyType = class;
TBase = class
function Say : String;
class function MYType:TMyType;
end;
TDer = class(TBase)
a: string;
b: string;
function Say2 : String;
end;
TMyType=class(TBase)
class function AsDer:TDer;
end;
{ TBase }
class function TBase.MYType: TMyType;
begin
Result:=TMyType(Self);
end;
function TBase.Say: String;
begin
Result:='TBase';
end;
{ TDer }
function TDer.Say2: String;
begin
Result:='TDer';
end;
{ TMyType }
class function TMyType.AsDer: TDer;
begin
Assert(Assigned(Self));
Result := TDer(Self) ;
end;
樣品用量低於,它的調用方法,但是當設置/獲取現場的引發錯誤。
procedure TForm1.Button1Click(Sender: TObject);
var
b,c:TBase;
begin
b:=TDer.Create;
c:=b.MYType.AsDer;
ShowMessage(b.MYType.AsDer.Say2); // OK. Running
if (@b<>@c) then ShowMessage('Not Equal'); // Shows message, Why ?
b.MYType.AsDer.a:='hey'; // Error
FreeAndNil(b);
end;
你有什麼想法嗎?
你到底想達到什麼目的? –
我需要一個特殊的目標。用戶友好的類型爲程序員鑄造。 – zgn
我相信這只是演示語法的演示代碼。在真實代碼中,您需要使用'is'和'as'運算符進行運行時類型檢查。不要盲目地寫'TDer(T)',你會寫'T as TDer',因此在'T'不是'TDer'的情況下引發一個可理解的運行時異常。 –