基类的类过程应该实例化一个后代的对象?

2 delphi

为什么在下面的代码中,我是否收到"失败"消息而不是"成功"

背景:我喜欢让类过程实例化它们的所有者对象,做某事,然后释放它.

但是,如果我有一个后代对象,这种方法不起作用:

关于如何在基类中提供可以作为子进程调用的类过程的任何建议?我错误地想到了这个吗?

Type
  TBase = class(TObject)
    Protected
       Procedure Proc1; Virtual;
    Public
       Class Procedure MyClassProc;
  end;

  Class Procedure TBase.MyClassProc;
  Var
    Base: TBase;
  begin
    Base := TBase.Create;
    Base.Proc1;
    Base.Free;
  end;

  Procedure TBase.Proc1;
  begin
    Assert(FALSE, 'Failed');
  end;

type
   TChild = class(TBase)
   protected
      Procedure Proc1; Override;
   end;

   Procedure TChild.Proc1;
   begin
     ShowMessage('Succeeded');
   end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TChild.MyClassProc;
end;
Run Code Online (Sandbox Code Playgroud)

Ged*_*ias 5

您可以通过元编程轻松完成!只需将"TBase.Create"改为"Self.Create","self"代表当前的类,如果是基类o子类,则不会满足.

Type
  TBase = class(TObject)
    Protected
       Procedure Proc1; Virtual;
    Public
       Class Procedure MyClassProc;
  end;

  Class Procedure TBase.MyClassProc;
  Var
    MyObject: TBase;
  begin
    // MyObject := TBase.Create;
    MyObject := Self.Create; // The Magic goes here, self is the class that's calling this method, in this case, TChild }
    MyObject.Proc1;
    MyObject.Free;
  end;

  Procedure TBase.Proc1;
  begin
    Assert(FALSE, 'Failed');
  end;

type
   TChild = class(TBase)
   protected
      Procedure Proc1; Override;
   end;

   Procedure TChild.Proc1;
   begin
     ShowMessage('Succeeded');
   end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TChild.MyClassProc;
end;
Run Code Online (Sandbox Code Playgroud)