如果显式调用Create,是否可以使编译器失败?

时间:2015-07-03 02:46:59

标签: delphi oop delphi-2007

我有很多单身人士,我不希望开发人员调用构造函数创建。相反,他们应该使用实例

功能
TdgpBankBranch = class(TDataGroup)
strict private
  class var InstanceVar : TdgpBankBranch;
private
  { Only for internal use }
  constructor Create (AOwner : TComponent); reintroduce;
protected
public
  class function Instance : TdgpBankBranch;
  class function Is_A_Live_Singleton: boolean;
  property Rec[Bank, Branch : integer]: TBankBranch read GetRec; default;
end;

我一直在将构造函数转移到 private 。这使代码分析器抱怨“非公共构造函数”

我可以将它们转回公开。如果尝试使用构造函数,是否有办法使编译器失败?

2 个答案:

答案 0 :(得分:2)

将构造函数移动到private将阻止其他单位直接调用Create(),但是与该类相同的单元内的代码仍然可以不受阻碍地调用它,因为单位内的隐性友谊如果您不希望直接调用Create()的类之外的任何代码,即使在同一个单元中,也请将其声明为strict private,因此只有类本身可以直接调用它。

答案 1 :(得分:1)

你问如何在有人调用.create时停止编译器创建一个对象,但是你要做的就是创建一个单例,这样有助于了解其他人如何解决这个问题。

在Delphi中,单例通常是通过在接口部分声明的函数实现的,该函数返回在单元的实现部分中声明的对象。如果实例尚不存在,该函数将创建实例,以提供延迟加载。清理工作通过最终确定部分完成。

在您的情况下,您只需创建一个为您提供实例的全局函数,而不是使用instance()函数。

这种方法可能源于课程和私人部分存在之前的日子,但它非常简单,并且可以防止您正在运行的问题。看看TClipboard是如何实现的。这种实现在Java或C#中是不可能的,因为它们没有全局函数,或者使得这个Delphi实现工作的范围类型......

或者看看David Heffernan给出的答案: Delphi Singleton Pattern

它甚至比TClipboard更好,因为它隐藏了实现部分中的整个类,真正阻止人们自己创建实例,但是你必须为你的类创建一个接口。