注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 [业内传闻]今天,7月25日..
 帮助

Delphi高手突破学习笔记二


2008-05-09 11:35:15
 标签:笔记 Delphi 高手   [推送到技术圈]

版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://wzcsying.blog.51cto.com/284684/76050
一、“类方法”与“类引用”类型
       一般所称的“方法”,都是指“对象方法”。也就是说,执行该方法,将可能导致对象的状态发生改变,即该方法可以更改对象的数据成员的值。而“类方法”,也就是理所当然属于类级别的函数(而非对象级别的),它所改变的是类的状态(而非对象的状态)。
       定义类方法,只需要在一般的方法声明前加上class关键字。如:
calss function MyTestFunction : string;
     需要注意:类方法中无法对对象的数据成员进行访问。
     在Object Pascal中,还有一种“类之类”的类型,也就是所谓的“类引用”。一般所称的类,是对其实例对象的抽象。定义一个类:
TMyClass = class;
       而“类引用”类型却是对“类”的抽象(元类),所以被称为“类之类”。定义一个“类之类”:
TMyClassClass = class of TMyClass;
        “类之类”可以直接调用“类”的“类方法”。如:
type
  TMyClass = class
  public
    class procedure Show();
  end;
  TMyClassClass = class of TMyClass;
 
var
  MyClass : TMyClassClass;
  MyObj : TMyClass;
begin
  MyObj := MyClass.Create();
  MyClass.Show();
  MyObj.Free();
end;
 
       在此例中,TMyClassClass作为TMyClass的元类,可以直接调用TMyClass的类方法。此前提到过的类构造函数,其实就是一个类方法,因此可以如同   MyObj := MyClass.Create();
        来创建对象,其结果与MyObj := TMyClass.Create();完全相同。
        但是,析构函数则不是类方法,而是普通的对象方法。因为析构函数只能销毁一个对象实例,其操作结果并非作用于该类的所有对象。因此,销毁对象只能通过对象来调用析构函数而不能通过类方法:MyObj.Free();
类类型和类引用的主要作用:它主要用在类型参数化上,因为有时在编译时无法得知某个对象的具体类型,而需要调用其类方法(如构造函数),此时可以将类型作为一个参数来传递。即在运行时再确定类型。TApplication的CreateForm()方法的第一个参数,也是类引用类型的:
procedure TApplication.CreateForm(
// TComponentClass = class of TComponent; 类引用类型
InstanceClass: TComponentClass;
var Reference
);
 
      允许在运行期确定类型,可以给程序带来莫大的灵活性。
     在Object Pascal中,类方法中还可以使用self。不过,此时self表示的是类,而非对象,因此使用上也有一些限制。如果是通过对象引用调用类方法,则self的值是该对象的类型;如果是通过类名调用类方法,则self的值是该类本身。由于在类方法中,self的值是类,而非对象,因此只能通过self调用类的构造函数和其他类方法。
      Self用法实例:
unit Unit2;
interface
type
  TClassMethodExample = class
  private
    FnInteger : integer;
  public
    class function ClassMethod1() : integer;
    class function ClassMethod2() : integer;
    function Method() : integer;
end;
implementation
{ TClassMethodExample }
class function TClassMethodExample.ClassMethod1: Integer;
begin
  self.Method(); // 非法,因为Method不是类方法
  self.ClassMethod2(); // 合法
end;
class function TClassMethodExample.ClassMethod2: Integer;
begin
  Result := self.FnInteger; // 非法,类方法中不能访问对象数据成员
end;
function TClassMethodExample.Method: Integer;
begin
  Result := 0;
end;
end.

本文出自 “烧赤壁的博客” 博客,请务必保留此出处http://wzcsying.blog.51cto.com/284684/76050





    文章评论
 
 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: