加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何从Delphi中的子类获取指向基类中方法的指针?

发布时间:2020-12-15 09:08:20 所属栏目:大数据 来源:网络整理
导读:这是我的代码示例: type TMyBaseClass = class public procedure SomeProc; virtual; end; TMyChildClass = class(TMyBaseClass) public procedure SomeProc; override; end;var SomeDelegate: procedure of object;procedure TMyBaseClass.SomeProc;begin
这是我的代码示例:

type
  TMyBaseClass = class
  public
    procedure SomeProc; virtual;
  end;

  TMyChildClass = class(TMyBaseClass)
  public
    procedure SomeProc; override;
  end;

var
  SomeDelegate: procedure of object;

procedure TMyBaseClass.SomeProc;
begin
  ShowMessage('Base proc');
end;

procedure TMyChildClass.SomeProc;
begin
  ShowMessage('Child proc');
  // here i want to get a pointer to TMyBaseClass.SomeProc (NOT IN THIS CLASS!):
  SomeDelegate := SomeProc;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TMyChildClass.Create do
  try
    // there will be "Child proc" message:
    SomeProc;
  finally
    Free;
  end;
  // there i want to get "Base proc" message,but i get "Child proc" again
  // (but it is destroyed anyway,how coud it be?):
  SomeDelegate;
end;

解决方法

我知道的一种方式是:

procedure TMyChildClass.BaseSomeProc;
begin
  inherited SomeProc;
end;


procedure TMyChildClass.SomeProc;
begin
  ShowMessage('Child proc');
  SomeDelegate := BaseSomeProc;
end;

第二个是将SomeProc声明从覆盖更改为重新引入:

TMyChildClass = class(TMyBaseClass)
 public
    procedure SomeProc; reintroduce;
 end;

然后将self转换为TMyBaseClass(不要使用as cast):

SomeDelegate := TMyBaseClass(self).SomeProc;

另请注意,您的代码将提供访问冲突,因为您在已释放的对象上调用SomeDelegate.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读