12.1.1 类数据
类数据是所有类对象之间共享的数据,提供全局存储但具有类特定的访问权限(包括访问限制)。您如何声明类数据?只需在类中定义一个标记为“class var”的部分:
type
TMyData = class
private
class var
FCommonCount: Integer;
public
class function GetCommon: Integer;
end;
类数据字段的声明块可以在同一部分的 var 中进行(如下所示,在 private 下面):
type
TMyData = class
private
class var
FCommonCount: Integer;
var
MoreObjectData: string;
public
class function GetCommon: Integer;
end;
除了声明类数据,您还可以定义类属性,我们将在后面的部分中介绍。
12.1.2 Virtual类方法和隐藏的self参数
虽然类方法的概念在各种编程语言中是通用的,但Object Pascal的实现有一些独特之处。首先,类方法有一个隐含的(或隐藏的)Self参数,就像实例方法一样。然而,这个隐藏的Self参数是指向类本身的引用,而不是类的一个实例。
乍一看,类方法有一个隐藏的参数指向类本身似乎没什么用。毕竟,编译器知道方法的类。然而,有一种特殊的语言特性可以解释这一点:与大多数其他语言不同,在Object Pascal编程语言中,类方法可以是Virtual类型。也就是说,在派生类中,你可以覆盖基类的方法,就像你可以对普通方法所做的那样。
注解:对Virtual类方法的支持与对Virtual构造函数的支持相关(这是一种特殊用途的类方法)。这两种特性在许多编译型和强类型的OOP语言中都找不到。
12.1.3 类的静态方法
在语言中引入静态类方法是为了平台兼容性。普通类方法与静态类方法之间的区别在于,静态类方法没有对其自身类的引用(没有指示类本身的Self参数),也不能是Virtual类型。
下面是一个简单的例子,其中有一些不正确的语句已被注释掉,这个例子来自ClassStatic示例:
type
TBase = class
private
class procedure TBase.One;
begin
// Error: Instance member 'FTmp' inaccessible here
// Show(FTmp);
Show('One');
// Show(Self.ClassName);
Show(ClassName);
end;
class procedure TBase.Two;
begin
Show('Two');
// Error: Undeclared identifier: 'Self'
// Show(Self.ClassName);
Show(ClassName);
Two;
end;
end;
在这两种情况下,您可以直接调用这些类方法,或者通过一个对象来调用它们:
TBase.One;
TBase.Two;
Base := TBase.Create;
Base.One;
Base.Two;
在Object Pascal中,静态类方法有两个有趣的特性,使其非常有用。第一个是可以用于定义类属性,这将在下一部分介绍。第二个是静态类方法与C语言完全兼容,接下来将会解释。