Delphi 类方法的搞笑答案

最近复习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是一个道理。

------------------



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值