父类的private成员在子类(前提是与父类在同一单元文件中)中也是可见的呀!?怎么Delphi这么怪啊!?欢迎大家参与讨论啊!Delphi的设计者们是怎么考虑

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

Steven_Jason

Unregistered / Unconfirmed
GUEST, unregistred user!
父类的private成员在子类(前提是与父类在同一单元文件中)中也是可见的呀!?怎么Delphi这么怪啊!?欢迎大家参与讨论啊!Delphi的设计者们是怎么考虑的啊? ( 积分: 30 )<br />以下程序中父类(TClass1)的private成员aa在子类TClass2中是可见的!!!
怎么Delphi这么怪啊!!
unit VisibilityUnit;

interface

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

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

type
Tclass1=class
private
aa:integer;
public
function test(a:integer):integer;
constructor create(a:integer);
end;

type
Tclass2=class(Tclass1)
// private
// aa:integer;
public
function test(a:integer):integer;
constructor create(a:integer);
end;


var
Form1: TForm1;

implementation

{$R *.dfm}
constructor Tclass1.create(a:integer);
begin
aa:=a;
end;

constructor Tclass2.create(a:integer);
begin
//aa:=a;
inherited;
end;


function Tclass1.test(a:integer):integer;
begin
result:=a*2;
end;

function Tclass2.test(a:integer):integer;
begin


result:=a*4 ;
// result := inherited test1(a);
// inherited ;

end;


procedure TForm1.Button1Click(Sender: TObject);
var
class1:Tclass1;
class2:Tclass2;
// class3:Tclass3;
begin
if RadioGroup1.ItemIndex=0 then
begin
class1:=Tclass1.create(1);
showmessage('The private mumber ''aa ''' + '= ' +
inttostr(class1.test(class1.aa)) + ' .' + #13 +
'The size in bytes of the object class1 are ' +
inttostr(class1.InstanceSize) + ' bytes .');
end
else if RadioGroup1.ItemIndex=1 then
begin
class2 := Tclass2.create(1);
// class1 := Tclass1.create(1);
showmessage('The private mumber ''aa ''' + ' inherited aa' + '= ' +
inttostr(class2.test(class2.aa)) + ' .' + #10 +
'The size in bytes of the object class2 are ' +
inttostr(class2.InstanceSize) + ' bytes .');
end;
end;

end.
 
同一单元自动为友元类
 
这就是delphi中的友类!!
 
可是在不同单元文件中,又是不可见的啊!
 
这个和C++的友元类是一样的啊!
 
好像与C++的友元类有区别啊!
 
设计是这样的,见怪不怪。
 
Delphi 设计就这样,用这个来实现 友元
 
以前也遇到过,原来是这么回事啊
 
在一个单元文件内的不同类互为友元类
 
有谁举例说一下C++中友元类的概念啊!我好久没接触C++了,谢谢!!!
 
感觉友元的概念是一种不成熟的面向对象的表现,至少友元的概念与封装的概念有所冲突,不知道大家是否这样觉得。面向对象的特征本来体现在:封装,继承和多态这三方面,但是友元却要打破封装,访问其他类的私有成员。虽然又方便的一面,但是滥用的话会破坏程序的整体结构。个人感觉应该像对待goto一样来对待友元,能不用就尽量不用。
 
然来这么回事~
 
我只想接点分
 
Delphi Friend Class
 
多人接受答案了。
 
后退
顶部