我有很多单身人士,我不希望开发人员调用构造函数创建。相反,他们应该使用实例
功能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 。这使代码分析器抱怨“非公共构造函数”。
我可以将它们转回公开。如果尝试使用构造函数,是否有办法使编译器失败?
答案 0 :(得分:2)
将构造函数移动到private
将阻止其他单位直接调用Create()
,但是与该类相同的单元内的代码仍然可以不受阻碍地调用它,因为单位内的隐性友谊如果您不希望直接调用Create()
的类之外的任何代码,即使在同一个单元中,也请将其声明为strict private
,因此只有类本身可以直接调用它。
答案 1 :(得分:1)
你问如何在有人调用.create时停止编译器创建一个对象,但是你要做的就是创建一个单例,这样有助于了解其他人如何解决这个问题。
在Delphi中,单例通常是通过在接口部分声明的函数实现的,该函数返回在单元的实现部分中声明的对象。如果实例尚不存在,该函数将创建实例,以提供延迟加载。清理工作通过最终确定部分完成。
在您的情况下,您只需创建一个为您提供实例的全局函数,而不是使用instance()函数。
这种方法可能源于课程和私人部分存在之前的日子,但它非常简单,并且可以防止您正在运行的问题。看看TClipboard是如何实现的。这种实现在Java或C#中是不可能的,因为它们没有全局函数,或者使得这个Delphi实现工作的范围类型......
或者看看David Heffernan给出的答案: Delphi Singleton Pattern
它甚至比TClipboard更好,因为它隐藏了实现部分中的整个类,真正阻止人们自己创建实例,但是你必须为你的类创建一个接口。