我在 Delphi 11 和类型转换方面做错了吗?

Am I doing something wrong with Delphi 11 and Typecasting?

如果我创建一组简单的类如下:

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 版本中有效。

您不能将 parent 的实例转换为 child 的实例。它不是这样工作的。

您可以将 parent 类型变量中的 class 实例转换为 child 类型,只要该变量创建为 child 的实例即可child.

如果我们拿通常的例子来说

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

重要的是声明类型的class实例,以及实际类型的class 实例。 已声明类型的parent类型的变量可能指向所有child类型的实际类型classes。这完全取决于在构造时分配 parent 类型声明的变量的类型(可以是 parent 类型或任何 child 类型)。

另一方面,child 的声明类型的变量不能指向 parent 的实例(除非你通过硬铸造强制它)。类型兼容性仅在向下(朝向 children 和 grandchildren)方向,而不是向上(朝向 parents 和 grandparents)方向.

您正在尝试将 parent 实例(TBase.Create 使实例成为 TBase class)转换为 child class。这类似于将 TAnimal 转换为 TCat 或 TDog。

不 - 你正在尝试的东西从来没有在任何 OO(Object 面向)语言中工作过 - 这根本不是 OO 的运作方式。