一、delphi语言中的Helper
在 Delphi2007 以后,引入了 Helper关键字,当时没有太在意,现在,在学 Objective-C,开发Iphone软件的是,Objective-C ,里面有一个 类别的概率--CateGory。 感觉和Delphi里面的 Helper 很类似。就回过头来,复习了一下。 (可以参考DelphiXe中的 Helper帮助: ms-help://embarcadero.rs_xe/rad/Class_and_Record_Helpers.html)
在DelphiXE写了一个 Demo,先看代码。
unit Unit1;interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TMyClass = class(TObject)
public
Value: String;
function MyFunction1: string;
function MyFunction2: string;
public
Constructor Create;
Destructor Destroy; override;
end;
TMyClassHelper = class helper for TMyClass
private
// FValue: String;
public
function MyFunction1: string;
function MyFunction2: string;
function MyFunction3: string;
// property MyValue :String read FValue write FValue;
TOtherClass = class(TMyClass)
function MyF: string;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
obj: TMyClass;
Obj2: TOtherClass;
begin
obj := TMyClass.Create;
showmessage(obj.MyFunction1);
showmessage(obj.MyFunction2);
showmessage(obj.MyFunction3);
Obj2 := TOtherClass.Create;
showmessage(Obj2.MyF);
showmessage(Obj2.MyFunction1);
end;
{ TMyClass }
constructor TMyClass.Create;
begin
Value := 'Hello World TMyClass';
end;
destructor TMyClass.Destroy;
begin
inherited;
end;
function TMyClass.MyFunction1: string;
begin
result := 'TMyClass.MyFunction1: ' + Value;
end;
function TMyClass.MyFunction2: string;
begin
result := 'TMyClass.MyFunction2';
end;
{ TMyClassHelper }
function TMyClassHelper.MyFunction1: string;
begin
result :=self.ClassName+ 'TMyClassHelper.MyFunction1' ;
end;
function TMyClassHelper.MyFunction2: string;
begin
result :=self.ClassName+ 'TMyClassHelper.MyFunction2';
end;
function TMyClassHelper.MyFunction3: string;
begin
result :=self.ClassName+ 'TMyClassHelper.MyFunction3';
end;
{ TOtherClass }
function TOtherClass.MyF: string;
begin
result :=Self.ClassName+ 'TOtherClass.MyF';
end;
end.
Frm 窗体代码:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 341
ClientWidth = 659
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 248
Top = 96
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end
通过上面的代码,可以总结一下:
1、定义
Type
TXXX = class / record helper for T... {T... 表示已存在的类}
{可以替换已存在的方法}
{也可以有新成员的方法}
end;
//这之后再使用 T... 类及其子孙类时, 都会优先使用 Txxx 的修改。
2、TXXX 类 不能有 构造函数和 析构函数,就是 Constructor 和 Destroy。
3、TXXX类,里面的Self,指向的 创建类,不是本身类。可以理解,TXXX,就是一个没有装饰,没有自己的独立的内存空间。
不如上面的代码
obj := TMyClass.Create;
showmessage(obj.MyFunction1); // self.classname 为 'TMyClass' 而不是 TMyClassHelper
showmessage(obj.MyFunction2); // self.classname 为 'TMyClass' 而不是 TMyClassHelper
showmessage(obj.MyFunction3); // self.classname 为 'TMyClass' 而不是 TMyClassHelper
Obj2 := TOtherClass.Create;
showmessage(Obj2.MyF); // self.classname 为 TOtherClass',不是 'TMyClass',也不是 ‘ TMyClassHelper’,这好理解
showmessage(Obj2.MyFunction1); // self.classname 为 'TOtherClass' 不是 'TMyClass',也不是 ‘ TMyClassHelper’
3、 Class 和 Record 都可以使用 Helper for
4、TXXX 不能定义自己的 字段和 属性,只能是 方法。
二、Objective-C 中 CateGory 类别
1、定义
@interface NSString (NewFunction)
-(NSNumber * )NewFunction; // 新定义的方法
@End
2、实现
@Implementation NSString (NewFunction)
-(NSNumber * )NewFunction // 新定义的方法
{
unsigned int length = [self length];
return ([NSNumber numberWithUnsignedInt : length]);
}
@End
3、定义一个类的多个类别,其名称必须唯一
4、 详细,可以参考 (http://www.cocoachina.com/bbs/read.php?tid=83441)