如果问题不是按照规则,而是出于好奇,请原谅我,我只是想知道为什么我的物品classtype让我感到困惑。
请参见以下代码:
type
TFirstClass = class
end;
TSecondClass = class(TFirstClass)
end;
TThirdClass = Class(TSecondClass)
End;
Run Code Online (Sandbox Code Playgroud)
以上是我的课程结构。
在一种方法中,我只想检查类对象的类类型。
var
obj1: TFirstClass;
obj2: TSecondClass;
obj3 : TThirdClass;
str: string;
begin
obj1 := TSecondClass.Create;
obj2 := TThirdClass.Create;
try
if obj1 is TFirstClass then
str := str + ' obj1: first ||';
if obj1 is TSecondClass then
str := str + 'obj1 : Second ||';
if obj2 is TSecondClass then
str := str + 'obj2 : Second ||';
if obj2 is TThirdClass then
str := str + 'obj2 : Third ||';
ShowMessage(str);
finally
FreeandNil(Obj1);
FreeandNil(Obj2);
end;
end;
Run Code Online (Sandbox Code Playgroud)
但str的结果是 obj1:第一|| obj1:第二|| obj2:第二|| obj2:第三||
为什么is关键字对所有if语句都返回true ?
该文档有答案:
执行动态类型检查的is运算符用于验证对象的实际运行时类。表达方式:
Run Code Online (Sandbox Code Playgroud)object is class如果object是由class或其后代之一表示的类的实例,则返回True,否则返回False。
他们的关键短语是“或其后代之一”。
TThirdClass从导出TSecondClass,从中导出TFirstClass。因此:
obj1TFirstClass本身就是一个。
obj2是TSecondClass这也是一个TFirstClass。
obj3(您已实例化了)还是TThirdClassWHICH还是TSecondClassWHICH TFirstClass。
该is运营商着眼于整个继承层次结构,并返回true,如果所请求的类类型中找到。如果要进行精确的类匹配,则需要直接比较类类型,例如:
if obj1.ClassType = TFirstClass then
...
if obj1.ClassType = TSecondClass then
...
if obj2.ClassType = TSecondClass then
...
if obj2.ClassType = TThirdClass then
...
Run Code Online (Sandbox Code Playgroud)