protected可见性表示符疑问 ( 积分: 30 )

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
源代码:
unit Unit1;
interface
 uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMySub = class(TBase)
protected
procedure invokeFShowname;
end;
var
Form1: TForm1;

implementation
{$R *.dfm}
{ TMySub }
procedure TMySub.invokeFShowname;
var
a:TBase;
b:TMySub;
begin
a:=TBase.Create;
 a.showname
//这里为何不能使用a.showname?
 a.name:='abcd';   //这里为何不能使用a.showname
b:=TMySub.Create;
b.showname;
b.name:='aaa';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
a:TBase;
b:TMySub;
begin
a:=TBase.Create;
 a.showname
//这里为何不能使用a.showname?
 a.name:='abcd';   //这里为何不能使用a.showname
b:=TMySub.Create;
b.showname;
end;
end.
==========================Unit2===============
unit Unit2;

interface

type
TBase = class
protected
name:string;
procedure showname();virtual;
end;

implementation

{ TBase }

procedure TBase.showname;
begin
showmessage('name='+name);
end;
end.

为何上面二处都不能使用protected里面的字段和方法?第一处在派生类TMySub中的方法里面调用父类的方法,为何不行呢?对可见性的概念有些糊涂了,还请高手指点,谢谢!
 
源代码:
unit Unit1;
interface
 uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Unit2, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMySub = class(TBase)
protected
procedure invokeFShowname;
end;
var
Form1: TForm1;

implementation
{$R *.dfm}
{ TMySub }
procedure TMySub.invokeFShowname;
var
a:TBase;
b:TMySub;
begin
a:=TBase.Create;
 a.showname
//这里为何不能使用a.showname?
 a.name:='abcd';   //这里为何不能使用a.showname
b:=TMySub.Create;
b.showname;
b.name:='aaa';
end;

procedure TForm1.Button1Click(Sender: TObject);
var
a:TBase;
b:TMySub;
begin
a:=TBase.Create;
 a.showname
//这里为何不能使用a.showname?
 a.name:='abcd';   //这里为何不能使用a.showname
b:=TMySub.Create;
b.showname;
end;
end.
==========================Unit2===============
unit Unit2;

interface

type
TBase = class
protected
name:string;
procedure showname();virtual;
end;

implementation

{ TBase }

procedure TBase.showname;
begin
showmessage('name='+name);
end;
end.

为何上面二处都不能使用protected里面的字段和方法?第一处在派生类TMySub中的方法里面调用父类的方法,为何不行呢?对可见性的概念有些糊涂了,还请高手指点,谢谢!
 
子类内好像可以调用父类的protected的方法吧,不会是ide的设置给限制了吧,呵呵。
b不行吧,在定义类时调用本类对象?对于概念也不是很熟
 
1、TForm 的 protected 域有个 FFormState 变量,你平时能把它敲出来吗?当然不能,这你也知道。
这个例子也是一样,a 作为 TBase 当然也不能访问它自己的保护域 name 和 showname 了(甭管 a 嵌套在哪里),这不是很简单的道理么。
2、所以切记,protected 仅对派生类可见,五十年不变。
 
Protected成员只有在子类中或是同一个单的其它类中能访问,a定义为TBase,但是TBase是在另外的单元中,所以TForm1中是不能访问的。b定义为TMySub, TMySub自动继承了TBase中的Protected成员,又与TForm1定义在同一单元中,所以TForm1能够访问b.showname。
 
后退
顶部