最近复习Delphi语法,发现有个类方法一直被忽略了。于是到论坛提问:"除了构造器,还有哪些类方法的例子。"
于是有人答了一发:
TSingleton=class
private
Singleton:TSingleton;
contructor InternalCreate;
public
class function Instance:TSingleton;
class constructor Create;
class destructor Destroy;
constructor Create;
end;
class function TSingleton.Instance:TSingleton;
begin
result := Singleton;
end;
class constructor TSingleton.Create;
begin
Singleton := TSingleton.InternalCreate;
end;
contructor TSingleton.InternalCreate;
begin
Inherited Create;
end;
class destructor TSingleton.Destroy;
begin
Singleton.Free;
end;
constructor TSingleton.Create;
begin
raise Exception.Create('单例类不能使用Create方法创建, 请使用Instance方法存取。');
end;
看起来挺高大上的,实现了一个单实例的模式。匆忙中没有验证正确性,就结贴了。今天把代码拿来验证一下,发现错漏百出,呵呵。
编译时,一直提示: procedure or function expected,光标停在 class constructor Create;一行。
我看了半天,不明白什么意思。想了很久才明白,
“类方法必须是procedure或者function,不允许是构造器或者析构器!!”
所以编译器一直保错。看来答题的人也没真正去测试过代码啊。
同理,class destructor Destroy; 也是错的。
而且,我想了半天,用类调用析构器是什么鬼?free一个类?只有对象才能free呢,大哥。不知道答者是怎么想出来类析构器的,呵呵。
而且,在类方法中也没有方法访问域,所以SingleTon字段是不能在类方法中使用的,答者也没有注意到这一点。
实际上,我认为类方法之所以使用得很少,正是类方法不能访问自己的域、属性造成的。
关于类方法的介绍建议查看:
http://www.cnblogs.com/del/archive/2008/01/16/1041625.html
----------
注意:
我学习Delphi的书是《Object Pascal Reference》,也就是Delphi 的自带帮助。
在讲到类方法时,原文是:
A class method is a method (other than a constructor) that operates on classes instead of objects. The definition of a class method must begin with the reserved word class.
需要注意的是,原文中的operates on class,作用于类这句话,很容易理解成把类作为参数传给方法,而且下面的举例也是传类变量参数:
class procedure GetInfo(var Info: TFigureInfo); virtual;
实际上,这是不对的。
正确的理解是:类A.类方法B。此时的类方法B就作用于类A。
这跟 SomeObj.methodXX(); //methodXX()作用于SomeObj是一个道理。
------------------