protected下的方法在子类中应该可以被继承 ( 积分: 50 )

  • 主题发起人 主题发起人 liuchong
  • 开始时间 开始时间
L

liuchong

Unregistered / Unconfirmed
GUEST, unregistred user!
protected和public下的方法在子类中应该可以被继承
下例中,protected中的方法在子类中却没有被继承:
unit Unit2;

interface

uses
Dialogs;

type
a=class
protected
procedure xxx;
end;
b=class(a)
end;

implementation

{ a }

procedure a.xxx;
begin
ShowMessage('xxx');
end;

end.

//----------------------------------------

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
c:b;
begin
c:=b.Create;
c.xxx;//这句不能通过,问题在这里
FreeAndNil(c);
end;

不解
 
你把 b=class(a) 这句写在unit2里面应该就可以了
 
当然可以了,凡是在protected 中的内容,不但可以继承还可以引用。
 
b=class(a)
是写在unit2里的

var
c:b;
begin
c:=b.Create;
c.xxx;//这句不能通过,问题在这里
FreeAndNil(c);
end;
 
protected成员可以在子类的方法中被访问,但不能通过子类的实例在外部使用。而Delphi有一个很奇怪的特性就是,定义在同一个unit中的类,可以毫无限制地访问私有和保护成员
 
unit Unit1;

interface

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

type
a=class
protected
procedure xxx;
end;
b=class(a)
end;

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

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure a.xxx;
begin
ShowMessage('xxx');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
c:b;
begin
c:=b.Create;
c.xxx;//通过!!!
FreeAndNil(c);
end;
end. //基本的语法问题,楼主要继续努力哦
 
jasph77
d中同一单元的类是“友元类”,我特意写在2个单元里的,一个单元当然可以啊。

地质的回答似乎有道理。
再等等其它答案。
 
再如下,强制转型:
unit Unit2;

interface

uses
Dialogs;

type
a=class
protected
procedure xxx;
end;

implementation

{ a }

procedure a.xxx;
begin
ShowMessage('xxx');
end;

end.

//----------------------------------------

implementation

uses Unit2;

{$R *.dfm}

type
b=class(a)
end;

procedure TForm1.FormCreate(Sender: TObject);
var
c:a;
begin
c:=a.Create;
b(c).xxx;//强制转型可以通过
FreeAndNil(c);
end;

protected这个dd是怎么设计的?
 
用inherted说明继续父亲的操作
如果没有这个说明,会默认是重写这个过程
 
protected 里面的方法理论上是应该不能被子类访问的(如果我没有记错的话);
但是当继承的类 跟使用继承的类放在同一个PAS文件里面的时候,
变成可以访问了
 
就像private 里面的方法理论上是不应该被子类访问到的,但是如果把它和它的子类放在一起,它的子类就能访问到它的私有方法!
 
引用楼住的话:
protected 里面的方法理论上是应该不能被子类访问的(如果我没有记错的话);
但是当继承的类 跟使用继承的类放在同一个PAS文件里面的时候,
变成可以访问了。
就像private 里面的方法理论上是不应该被子类访问到的,但是如果把它和它的子类放在一起,它的子类就能访问到它的私有方法!
-------------------------------------------------------------------------
你这是从什么书上看到的理论。
面向对象定义:protected 只有子类和自身可以引用,而子类还可以继承改写,并不是说只能自身用!如果只能自身引用,那还要Private干什么呢?
只是Delphi在同一个单元中可以不受这个限制罢了,但是强烈建议程序员还是遵守这个限制。
建议楼主多看看面向对象方面方面的书。
 
把书再看看.
一个类的保护成员只能被类访问,不能被类的对象访问.
(但delphi中同一个unit除外)
procedure TForm1.Button1Click(Sender: TObject);
var
c:a;
begin
c:=a.Create;
c.xxx;//同样也不能通过,呵呵
FreeAndNil(c);
end;
 
private在子类内部不可以使用
protected可以在本类及子类的内部使用
这里没有讨论改写的问题
“一个类的保护成员只能被类访问,不能被类的对象访问”
这句才是关键所在。
补充的是:在使用的单元强制转型,也可以使用。
 
to:xingkong97
你引用我的话,可是那不是我说的话,拜托你看清。
 
哈哈。。。。。。没看清,不好意思啊。
楼主说的是对的。
 
多人接受答案了。
 
后退
顶部