怎样访问一个对象的私有变量???(50分)

  • 主题发起人 主题发起人 dohye
  • 开始时间 开始时间

私有是private吗?
如果是,那么外不是不可能访问的,除非通过
publish一个property来访问它,或对象内部
使用。
 
或者和那个类在同一个pas文件中
 
对于一个对象来说,其私有变量只能通过调用其方法来设置,但取不出变量本身的
值,即使是该对象的子孙也不行!
 
但是对象没有提供相应调用方法,
而我必须在其他单元调用,
另外如果我自己加上一个方法
这编译提示该对象conversion不同.
 
那类是你自己编的还是别人的,如果是自己编的自己加一个
访问该对象的方法就可以了,如果是别人的就叫他帮你加一
方法吧.
 
在public中添加
一个过程来访问(设置)它.
 
从这个类派生一个子类,在子类定义一个Public过程(或Property),用来操作这个私
有的类成员。
子类的Create过程怎么办?重载,用保留字'Inheritate'继承父类的Create方法,
再加上自己的。例子如下:

unit TestUnit;

interface

type
TFather = class(TObject)
private
{ Private declarations }
public
{ Public declarations }
end;

TChild = class(TFather)
private
a: Integer;
public
function Read_a(): Integer;
procedure Write_a(const Int: Integer);
constructor Create;
end;

var
Child: TChild;

implementation

function TChild.Read_a: Integer;
begin
result:=a;
end;

procedure TChild.Write_a(const Int: Integer);
begin
a:=Int;
end;
constructor TChild.Create;
begin
Inherited;
a:=0;
end;

end.

注意:如果保留字'Inherited'后面没有指明具体的Create方法,就默认是继承父类
的Create,要求子类的Create方法的参数和父类一致。
 
>另外如果我自己加上一个方法
>这编译提示该对象conversion不同.

所谓加方法,是修改那个类的源代码,也就是修改那个类,比如:
private
fmyprv:integer
//就这个
...
public
function GetMyPrv:Integer;
procedure SetMyPrv(value:integer)
//加这两个

...
//基本实现
function myclass.getmyprv:integer
begin
getmyprv := fmyprv;
end;

procedure myclass.setmyprv(value:integer);
begin
if fmyprv <> value then
fmyprv := value;
end;
 
如果与父类在同一个文件中,可以直接访问。

如果不在一个文件中,通过对象的起始地址再查出该私有变量的偏移就可以吧。
 
C++中可以强制将一个Private变量继承为Public变量,不知Object Pascal能否实
现?
 
呵呵, 如果不修改原码, 真的可以实现吗?
 
To cytown:
真的可以实现!我在大学曾经试过?
示例见<<C++编程秘诀>>或<<Borland C++4编程指南>>(清华大学出版社),具体是
哪本书,我记不太清楚,有这两本书的网友可以查一查。这两本书都对C++讲的特深
入。
 
南京邮电学院的网友可以到图书馆A室或C室可以查到,现在我也想知道如何实现?
有此两本书的网友快翻书哇!
 
“C++编程秘诀”或“Borland C++4编程指南”(清华大学出版社),
 
结束吧,

在实例中是不能访问的。
 
如果这个方法在父类中定义,并且在父类中是PUBLIC的,就可以有方法使用
 
类的作用是封装。如果连我的私有变亮你都能直接访问,那还封它有什么用?
如果在同一单元(PAS),就象C++中的Friend一样,是可以访问的。
 
多人接受答案了。
 
后退
顶部