概念:封装就是指利用类将数据和方法通过访问控制符封装起来,从而实现功能的隐匿。
类成员的可见性:
private //不可见。
protected //派生类可见。
public //可见。
published //可见。用于运行时信息。
automated //可见。用于兼容。
//在范围以外时:{$M+}(默认)时是 published;{$M-}时是 public
(1)私有成员访问符(private):表示类的成员为该类私有,之在该类中可见,也就是说类中所定义的私有成员只能由类中的成员或方法调用。
(2)受保护成员访问符(protected):受保护的成员只能由该类自身和该类派生的子类所访问。如果只想要子类继承父类一部分功能就可以声明为受保护的。
(3)公有的成员访问符(public):没有权限,只要成员还存在,就可以在程序的任何地方调用这个类中的成员,父类公有成员在所派生的子类中也可以访问。
(4)发布的成员访问符(published):访问权限与公有访问权限一样,区别在于发布的成员在运行时可以产生运行时的类型信息,一般用于组件属性。
(5)自动的成员访问符(automated):访问权限与公有访问权限一样,区别在于发布的成员会产生自动化类型的信息(ATI)。只有当定义或使用自动化对象(OLE技术)时才有必要声明。
在类中如果不指明成员访问符,则类中的成员默认访问符为公有成员访问符,
思路:如果向电脑及零部件抽象成不同的类,就可以很好地利用这些部件类组成一个新的电脑类,而一个电脑类在运行时提供给用户操作的只有一个开机,这样其他部件的初始化
和启动过程就没必要提供给用户,而只需要提供给电脑类执行就可以了。所以在电脑类中只要将运行其他部件的方法设为私有或受保护的成员就可以了。
//这个类中的两个字段没有封装
TMyClass1 = class
FName: string;
FAge: Integer;
end;
//这个类中的两个字段封装了, 外部不能读写
TMyClass2 = class
private
FName: string;
FAge: Integer;
//public
end;
//那怎么读写? 用属性啊
TMyClass3 = class
private
FName: String;
FAge: Integer;
procedure SetAge(const Value: Integer);
procedure SetName(const Value: String);
published
property Name: String read FName write SetName;
property Age: Integer read FAge write SetAge;
end;
{
现在 TMyClass3 中的两个字段: FName、FAge 和两个方法: SetAge、SetName
都被封装在私有区(private)内, 不允许外部读写, 只能是内部使用.
不过, private 的封装在本单元内是无效的!
现在好了, 有了 strict 标识符.
}
//这个封装好了, 在 private 前加了 strict ; 现在除了自己谁也访问不了私有区.
TMyClass4 = class
strict private
FName: String;
FAge: Integer;
procedure SetAge(const Value: Integer);
procedure SetName(const Value: String);
published
property Name: String read FName write SetName;
property Age: Integer read FAge write SetAge;
end;