Self 什么意思 用途很大\吗? Self 什么意思 用途很大\吗?这个 关键字是什么意思呢 好多代码用到了它,它能起到那些作用呢 ?那位大哥,帮忙讲义下? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对象自身,类似c里的this,vb里的me 表示自己,在类里通常是省略的比如可视控件要在一个Panel生成,需要在该控件得Create中加入self---Edit := TEdit.Create(Self)这里表示Panel,既是Edit的Owner而在类里,就表示该类,比如 : TMocha = class(TCondimentDecorator) public beverage : TBeverage; constructor Create(beverage : TBeverage); ... ... constructor TMocha.Create(beverage : TBeverage); begin ... self.beverage := beverage; ... 在一般方法里面,Self就是当前实例的指针,一般很少直接引用,但有时候确实需要,比方重名的时候:type TUser = class private UserName: string; public procedure SetUserName(const UserName: string); function GetUserName(): string; end;function TUser.GetUserName(): string;begin Result := UserName; //也可以用Self.UserNameend;procedure TUser.SetUserName(const UserName: string);begin Self.UserName := UserName; //这里前面的UserName必须明确用Self.UserName,因为直接用UserName的话, //按照作用域规则,引用的将是参数UserName而不是字段UserNameend;但是参数名稍微改一下,就不必用到他了procedure TUser.SetUserName(const aUserName: string);begin UserName := aUserName; //这里Delphi就很明确,你前面的UserName引用的是实例字段end;在类方法里面,Self引用的是类指针 我从对象模型和编译原理的角度谈谈自己的理解:同一个类(Class)可以有多个对象(Object)实例,比如有一个TPerson类:type TPerson = class(TObject) private fName: string; public constructor Create(const name: string); procedure SayHello; // 类的普通方法 class procedure CheckSelf; // 类方法 property Name: string read fName; end;{ TPerson }constructor TPerson.Create(const name: string);begin inherited Create; fName := name;end;procedure TPerson.SayHello;begin ShowMessage('I''m ' + fName);end;class procedure TPerson.CheckSelf;begin if (Integer(Self) = Integer(TPerson)) then begin ShowMessage('Integer(Self) = Integer(TPerson)'); end;end;我们可以创建TPerson的多个实例,例如:var bob, david: TPerson;begin bob := TPerson.Create('Bob'); david := TPerson.Create('David'); try bob.SayHello; // 显示I'm Bob david.SayHello; // 显示I'm David TPerson.CheckSelf; // 显示Integer(Self) = Integer(TPerson) bob.CheckSelf; // 显示Integer(Self) = Integer(TPerson) finally bob.Free; david.Free; end;end;从上面的代码看以看出,bob和david拥有各自的数据(fName),但调用的却是同一个SayHello方法(相同的地址)。怎么做到的呢?从编译原理的角度来说,所有类的方法都有一个隐含的参数(这也是类的方法和普通的方法的重要区别),这个参数在Delphi中被命名为Self指针。对于类的普通方法来说,Self指针指向的就是某个对象实例,所以同一个SayHello方法可以打印出正确的结果);对于类方法(class method)来说,虽然有两种调用方式,但传入的Self指针始终指向的是该类型。另外还有一个比较有意思的用法,大家看看TObject.Free方法,也可以想想这样有什么好处:procedure TObject.Free;begin if Self <> nil then Destroy;end;再贴一段代码比较一下~var nobody: TPerson;begin nobody := nil; nobody.Free; // OK & Do Nothing // nobody.SayHello; // Access Violation Exceptionend; self就是指自己有的时候无法获取自身的实例名的时候,往往用self.xxx来实现 在作物料需求计划时,我这样分解物料的方法不对,怎么改? DELPHI:希腊古都,太阳神殿就在该城市 recordset用法 急救!!(有分) 具有挑战性的问题!答对给分! 为答谢CSDN上的各位网友对我无私的帮助,现将我手上的第三方控件,有100多种吧,全部带源码,上传发给大家 bde问题 我有个帖没人答,我不想有没给分的帖子,因此有人去了就20分全部送上! “gz”什么意思 急需决绝一个巨弱的问题,请帮忙 太有才了! QuickReport 的分组页码如何实现?
比如可视控件要在一个Panel生成,需要在该控件得Create中加入self---Edit := TEdit.Create(Self)
这里表示Panel,既是Edit的Owner而在类里,就表示该类,比如 :
TMocha = class(TCondimentDecorator)
public
beverage : TBeverage;
constructor Create(beverage : TBeverage);
... ... constructor TMocha.Create(beverage : TBeverage);
begin
...
self.beverage := beverage;
...
TUser = class
private
UserName: string;
public
procedure SetUserName(const UserName: string);
function GetUserName(): string;
end;function TUser.GetUserName(): string;
begin
Result := UserName; //也可以用Self.UserName
end;procedure TUser.SetUserName(const UserName: string);
begin
Self.UserName := UserName;
//这里前面的UserName必须明确用Self.UserName,因为直接用UserName的话,
//按照作用域规则,引用的将是参数UserName而不是字段UserName
end;但是参数名稍微改一下,就不必用到他了
procedure TUser.SetUserName(const aUserName: string);
begin
UserName := aUserName; //这里Delphi就很明确,你前面的UserName引用的是实例字段
end;
在类方法里面,Self引用的是类指针
type
TPerson = class(TObject)
private
fName: string;
public
constructor Create(const name: string);
procedure SayHello; // 类的普通方法
class procedure CheckSelf; // 类方法
property Name: string read fName;
end;{ TPerson }constructor TPerson.Create(const name: string);
begin
inherited Create;
fName := name;
end;procedure TPerson.SayHello;
begin
ShowMessage('I''m ' + fName);
end;class procedure TPerson.CheckSelf;
begin
if (Integer(Self) = Integer(TPerson)) then
begin
ShowMessage('Integer(Self) = Integer(TPerson)');
end;
end;
我们可以创建TPerson的多个实例,例如:var
bob, david: TPerson;
begin
bob := TPerson.Create('Bob');
david := TPerson.Create('David');
try
bob.SayHello; // 显示I'm Bob
david.SayHello; // 显示I'm David
TPerson.CheckSelf; // 显示Integer(Self) = Integer(TPerson)
bob.CheckSelf; // 显示Integer(Self) = Integer(TPerson)
finally
bob.Free;
david.Free;
end;
end;
从上面的代码看以看出,bob和david拥有各自的数据(fName),但调用的却是同一个SayHello方法(相同的地址)。怎么做到的呢?从编译原理的角度来说,所有类的方法都有一个隐含的参数(这也是类的方法和普通的方法的重要区别),这个参数在Delphi中被命名为Self指针。对于类的普通方法来说,Self指针指向的就是某个对象实例,所以同一个SayHello方法可以打印出正确的结果);对于类方法(class method)来说,虽然有两种调用方式,但传入的Self指针始终指向的是该类型。另外还有一个比较有意思的用法,大家看看TObject.Free方法,也可以想想这样有什么好处:procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
再贴一段代码比较一下~var
nobody: TPerson;
begin
nobody := nil;
nobody.Free; // OK & Do Nothing
// nobody.SayHello; // Access Violation Exception
end;