如果我創建一組簡單的類,如下所示:
type
TBase = class(TObject)
function BaseFunction : boolean;
end;
TBase1 = class(TBase)
function Base1Function : boolean;
end;
TBase2 = class(TBase1)
function Base2Function : boolean;
end;
Invalid Typecast Error當我嘗試執行以下操作時,為什么會得到一個?
procedure TForm1.FormCreate(Sender: TObject);
var
T1 : TBase2;
begin
T1 := TBase.Create as TBase2;
end;
它可以修復嗎?我覺得我錯過了一些如此明顯的東西,但我就是看不到它。我很肯定這在以前的 Delphi 版本中有效。
uj5u.com熱心網友回復:
您不能將父實體強制轉換為子實體。這不是它的作業原理。
您可以將父型別變數中的類實體強制轉換為子型別,只要該變數是作為子實體創建的。
如果我們舉一個通常的例子
TAnimal = CLASS
...
END;
TDog = CLASS(TAnimal)
...
END;
TCat = CLASS(TAnimal)
...
END;
那么以下適用:
VAR
Animal : TAnimal;
Dog : TDog;
Cat : TCat;
...
Animal:=TAnimal.Create;
Dog:=Animal AS TDog; // Cannot work - Animal can be either a Cat or a Dog
...
Animal:=TCat.Create;
Cat:=Animal AS TCat; // Works - Animal *is* a TCat.
Dog:=Animal AS TDog; // Cannot work - you can't convert a Cat to a Dog
...
Cat:=TCat.Create;
Animal:=Cat; // Works - A Cat *is* an Animal
Dog:=Cat AS TDog; // Cannot work - you can't convert a Cat to a Dog
重要的是類實體的宣告型別和類實體的實際型別。宣告型別為父型別的變數可能指向所有子類的實際型別。這一切都取決于在構造時分配父型別宣告的變數的型別(可以是父型別或任何子型別)。
另一方面,子宣告型別的變數不能指向父實體(除非您通過硬轉換強制它指向)。型別兼容性僅在向下(朝向子孫)方向,而不是在向上(朝向父母和祖父母)方向。
您正在嘗試將父實體(TBase.Create 使實體成為 TBase 類)轉換為子類。這類似于將 TAnimal 轉換為 TCat 或 TDog。
不——你正在嘗試的東西從來沒有在任何 OO(面向物件)語言中作業過——這根本不是 OO 的運作方式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424513.html
標籤:德尔福
