Self 什么意思  用途很大\吗?
这个 关键字是什么意思呢  
好多代码用到了它,它能起到那些作用呢 ?那位大哥,帮忙讲义下?

解决方案 »

  1.   

    对象自身,类似c里的this,vb里的me
      

  2.   

    表示自己,在类里通常是省略的
    比如可视控件要在一个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;
        ...
      

  3.   

    在一般方法里面,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.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引用的是类指针
      

  4.   

    我从对象模型和编译原理的角度谈谈自己的理解:同一个类(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 Exception
    end;
      

  5.   

    self就是指自己有的时候无法获取自身的实例名的时候,往往用self.xxx来实现