Delphi无法隐藏Constructor函数?
虽然我把Construtor声明成private,但是还是可以Create.不会在编译时报错,我希望只能有一个实例.
TSinglon = class()
private
Construtor Create();
end.
var
Singlon : TSinglon;
但是还是可以Singlon := TSinglon.Create();, 其实他调用的是TObject的Create方法, 在运行期才会报错, 难道就没有方法覆盖父类的construtor函数么?
[解决办法]
Create在TObject就被Public出来了,不能隐藏它
关于singlon模式,Delphi中最好用override NewInstance类函数来实现的.
来自:Traveller, 时间:2004-7-19 16:55:54, ID:2719562
薄荷兄真是一句话点醒梦中人啊!受教受教!
请看我的实现,这种方式下,用户无论何时调用Create返回的都是同一个指针而不会真的创建新的对象:
type
TTestObj = class(TObject)
private
FTestData: string;
public
class function NewInstance: TObject; override;
procedure FreeInstance; override;
property TestData: string read FTestData write FTestData;
end;
{ TTestObj }
var
mInst: TTestObj;
mInstRef: Integer;
procedure TTestObj.FreeInstance;
begin
Dec(mInstRef);
if mInstRef = 0 then
inherited;
end;
class function TTestObj.NewInstance: TObject;
begin
if not Assigned(mInst) then
mInst := Inherited NewInstance as TTestObj;
Inc(mInstRef);
Result := mInst;
end;
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
a: TTestObj;
begin
a := TTestObj.Create;
a.TestData := 'abc ';
FreeAndNil(a);
end;
procedure TForm1.btn2Click(Sender: TObject);
var
a: TTestObj;
begin
a := TTestObj.Create;
ShowMessage(a.TestData);
FreeAndNil(a);
end;
initialization
mInst := TTestObj.Create;
finalization
FreeAndNil(mInst);
end.
参见:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2515036
[解决办法]
del123(筷子) ( ) 信誉:100 Blog 加为好友 2007-04-24 10:02:05 得分: 0
ysai的方法不错,但我怕哪里谁又Create出来一堆, 如果能隐藏起来, 免得找错误时麻烦.
-----------------------------
就是这个方法,你自己测试一下就知道了......