保护方法的访问(50分)

  • 主题发起人 主题发起人 swordman_ji
  • 开始时间 开始时间
S

swordman_ji

Unregistered / Unconfirmed
GUEST, unregistred user!
protected(保护),所保护的成员只能被当前类和当前类的子类访问

也就是说有两个类Ta和Tb,(ta,tb之间没有继承关系)
Tb中有一个保护方法kk

那怎么算是,别的类调用当前类的保护方法呢,也就是说ta调用tb.kk

虽然这会引起程序的错误,但如果我想写这样的程序来实验一下的应该怎样写呢




 
Object Pascal 中,只要是写在同一个 unit 中的 Class ,都允许互相访问 protected
和 private 成员,并没有严格遵守 OO 的约定。
你的问题 TA 、TB 写在同一个 unit 中就可以了。
 
假设现在TA 、TB不是写在同一个 unit 中
____
重复我的问题
两个类Ta和Tb,(ta,tb之间没有继承关系,TA 、TB不是写在同一个 unit 中)
Tb中有一个保护方法kk


我不是想知道如何把它写正确,
我是想知道"别的类调用当前类的保护方法,也就是说ta调用tb.kk"这句话怎样用程序实现.
我是想用程序来实验一下这句话,出现错误也没关系,(当然把这句话写成程序肯定是错的)




 
"别的类调用当前类的保护方法,也就是说ta调用tb.kk"这句话怎样用程序实现.
----这句话从哪看到的?
是在别的类的实例中调用这个类的实例的保护方法吧

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
AClass: TAClass;
begin
AClass := TAClass.Create;
try
AClass.BProc;
finally
AClass.Free;
end;
end;

end.

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

interface

uses
Dialogs;

type
TAClass = class
protected
procedure AProc;
public
procedure BProc;
end;

implementation

procedure TAClass.AProc;
begin
ShowMessage('轮不到你看我, 编译都通不过:)');
end;

procedure TAClass.BProc;
begin
ShowMessage('看见我了吧:)');
end;

end.


 
>>两个类Ta和Tb,Tb中有一个保护方法kk
你在Ta所在的unit中加上这一句:
type
TMyTb=Class(Tb);
.
.
.
这不成了在同一个unit中了吗?
 
首先要谢谢你们的回答

但我提出这样一个问题,大家讨论

1)Delphi是对单元封装的,也就是说在同一单元中,任何过程都可以对类中的私有、保护、公有、公布方法引用.
所以就算不是‘当前类’或‘当前类的子类’要调用‘别的类’的保护方法,也不会错
例如
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type //自定义类
op=class
protected
procedure hu;
end;
var
Form1: TForm1;
f:op;
implementation

{$R *.DFM}
procedure op.hu;
begin
showmessage('op.hu')
end;
procedure TForm1.Button1Click(Sender: TObject);//调用保护方法

begin
f:=op.create;
f.hu;
end;

end.

2)一个类的私有和保护方法,一般情况下,对外部单元是不可访问.
所以就算'当前类的子类’要调用‘父类’的保护方法,也会错
1)unit Unit1;

interface

uses
unit2,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
f0:op;//op类在unit2中
begin
f0:=op.create
f0:=cr.create;
f0.hu;//出现错误
f1.hu;//出现错误
end;

end.

2)unit Unit2;

interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
op=class
protected
procedure hu;
end;
cr=class(op)
end;
implementation
procedure op.hu;
begin
showmessage('op.hu')
end;
end.

现在有一个问题,'保护方法'本来是只允许'当前类'和'当前类的子类'访问
但有了以上的两种情况我不知道
'非当前类'和'非当前类的子类'访问'保护方法'是错的,这句话是怎样写程序才实验出来




 
多人接受答案了。
 
后退
顶部