Delphi面向对象机制的困惑
OOP中一个非常重要的概念就是封装。一个类的私有变量和私有方法不能被它的子类继承,对子类是不可视的,体现了一种严格的封装思想。但我现在有点疑惑:属性的设置也是为了封装,而对一个类的属性的操作主要是通过操作其私有部分相关的变量。那么,它的子类继承父类的公开属性,是否也间接访问了父类的私有变量呢?
我做了如下的例子:
unit Unit2;
interface
type
TA = class
private
FName: string;
function GetName: string;
procedure SetName(const Value: string);
public
property Name: string read GetName write SetName;
end;
TB = class(TA)
end;
implementation
{ TA }
function TA.GetName: string;
begin
Result := FName;
end;
procedure TA.SetName(const Value: string);
begin
if FName <> Value then
FName := Value;
end;
end.
// 不放在同一个单元里,是因为Delphi同一个单元里的变量都相当于C++里的友元
unit Unit1;
interface
……
……
implementation
{$R *.DFM}
uses
Unit2;
procedure TForm1.Button1Click(Sender: TObject);
var
B: TB;
begin
B := TB.Create;
B.Name := 'aaaaaaaaaaa'; // ********
Caption := B.Name;
end;
end.
在// ******处设置了断点,运行时跟踪到方法内部,发现对属性的赋值还是调用了TA的SetName方法。而这个方法是TA的私有方法,这岂不是对子类可视了吗?
可能是我对面向对象的思想有误,现在觉得很困惑。
搞Delphi也有一段时间了,没深入考虑过这个问题。今天看UML的书时,突然想到这个问题,望各位大侠指点迷津。
又:请各位帮忙推荐一本关于XML的比较深入的好书