【问题标题】:Using inherited in the "Create" constructor of an TObject在 TObject 的“创建”构造函数中使用继承
【发布时间】:2010-10-20 19:35:21
【问题描述】:

我应该在从 TObject 或 TPersistent 派生的类的构造函数中调用“inherited”吗?

constructor TMyObject.Create;
begin
 inherited Create;   // Delphi doc: Do not create instances of TPersistent. Use TPersistent as a base class when declaring objects that are not components, but that need to be saved to a stream or have their properties assigned to other objects.    
 VectorNames := TStringList.Create;
 Clear;
end;

【问题讨论】:

    标签: delphi


    【解决方案1】:

    是的。它什么也没做,真的,但它是无害的。我认为在始终调用继承的构造函数时保持一致是有价值的,而无需检查实际上是否存在实现。有人会说调用继承的 Create 是值得的,因为 Embarcadero 将来可能会为 TObject.Create 添加一个实现,但我怀疑这是真的;它会破坏不调用继承创建的现有代码。不过,我认为仅出于一致性的原因调用它是一个好主意。

    【讨论】:

    • “它什么也没做”??!!它启动了基本的对象存储!并且可能会在您继承的基类中定义所需的东西。不调用它可能会导致最糟糕的错误和错误:那些你没有立即发现发生了什么的错误和错误。
    • IIRC,在调用构造函数 (Create) 之前,基本存储空间已经分配完毕。
    • mj2008,你是对的。斯蒂恩,你错了。阅读源代码!
    • 我认为最重要的原因是 Gamecat 所说的——在某些时候,您可能希望将您的类从 TObject 重新设置为其他东西,并且新类可能包含非平凡的构造函数。
    • @Stijn,TObject的构造函数什么都不做,分配存储由NewInstance完成,由InitInstance初始化。 TObject 的两个类方法。
    【解决方案2】:

    我总是这样做。

    如果您正在重构并将代码移动到一个共同的祖先,那么调用继承的 Create 具有以下优点:

    1. 如果共同祖先有构造函数,你不能忘记调用它。
    2. 如果共同祖先的构造函数具有不同的参数,编译器会为此发出警告。

    【讨论】:

    • 虽然 Craig 是正确的,但这些也是我称之为继承 Create 的主要原因,而不是保持一致。
    【解决方案3】:

    您还可以覆盖“procedure AfterConstruction”。这个过程总是被调用,不管什么样的构造函数。

    public
      procedure AfterConstruction; override;
    end;
    
    procedure TfrmListBase.AfterConstruction;
    begin
      inherited;
      //your stuff, always initialized, no matter what kind of constructor!
    end;
    

    例如:如果您想使用不同于普通 TObject.Create 的构造函数创建对象,例如 TComponent.Create(AOwner) 或自定义(重载)构造函数,则可能会出现问题,因为未调用您的覆盖并且(在这种情况下)您的“VectorNames”变量将为 nil。

    【讨论】:

    • 如果你的重写构造函数没有被调用,那么它是你的后代类中的一个错误。这是后代开发人员需要担心的问题,而不是您。并且可以跳过对 AfterConstruction 的调用,出于同样的原因,您可以跳过对构造函数的调用:后代提供自己的实现并忽略调用继承的方法。
    • Rob:如果你创建一个生成 TObject 后代的工厂类,你不能使用 TObject.Create() 因为它不是虚拟的!如果你在你的工厂中创建一个 TComponent 后代:它有一个不同的构造函数 (Create(AOwner))。这就是为什么你应该使用 AfterConstruction:它总是被调用,不管什么样的构造函数
    【解决方案4】:

    我调用它,除非我需要一个非常优化的构造函数。

    【讨论】:

      猜你喜欢
      • 2012-12-09
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多