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 本文出自 51CTO.COM技术博客 |


wzcsying
博客统计信息
热门文章
最新评论
友情链接
