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

Delphi – 确保调用类构造函数

发布时间:2020-12-15 04:08:28 所属栏目:大数据 来源:网络整理
导读:这可能是一个简单的问题,但我想知道如何确保调用类的构造函数. 如果我有以下代码: type TMyObject = class(TObject) public constructor Create;override;end;implementation constructor TMyObject.Create;override;begin inherited; //do other instantia
这可能是一个简单的问题,但我想知道如何确保调用类的构造函数.

如果我有以下代码:

type TMyObject = class(TObject)
  public
     constructor Create;override;
end;

implementation 

constructor TMyObject.Create;override;
begin
  inherited;
  //do other instantiation
end;

Delphi不允许这样 – ‘无法覆盖静态方法’.

我想要做的是确保使用我的自定义Create构造函数创建对象并禁止调用祖先Create构造函数.

我目前解决这个问题的方法是定义一个唯一签名的Create构造函数,如下所示:

constructor Create(aName : String);overload;

但程序员可能会调用祖先的Create()方法.

解决方法

您只需重新引入具有祖先名称的构造函数.一旦你这样做,用户就无法创建一个调用TObject中引入的构造函数的TMyObject.如果你使用这样的代码:
TMyObject = class
public
  constructor Create;
end;

constructor TMyObject.Create;
begin
  // I am not calling the inherited constructor because
  // I do not want to.
end;

您不在TMyObject.Create上使用override修饰符,因为祖先的构造函数不是虚拟的.

使用此方案,用户无法使用祖先中引入的构造函数创建TMyObject.在这种情况下,祖先是TObject,它唯一的构造函数是TObject.Create.如果用户编写此代码:

X := TMyObject.Create;

很明显,TMyObject的构造函数将被调用,而不是TObject中引入的构造函数.

如果你害怕用户为了使用祖先的构造函数创建你的类来跳过箍,你可以从AfterConstruction方法中完成你的东西.这是一个虚方法,所以即使你的对象是使用祖先类型的类引用创建的,它也会被调用:

TMyObject = class
public
  procedure AfterConstruction;override;
end;

(编辑:李大同)

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

    推荐文章
      热点阅读