Delphi 类成员的默认访问权限(用RTTI检测)
2015-08-21 15:54
483 查看
类的成员,如果没有private、public等显示什么,直接在class下面,没有写访问权限的限定符,这种成员是不是默认的访问权限啊?还是publish的访问权限啊?
----------------------------------------------------------
什么答案都有, 就是都不愿意动手, 让我们来看看答案是什么吧
最后程序输出的结果是:
FieldName: MemberOfTTest1, Visibility: Public
FieldName: MemberOfTest2, Visibility: Published
FieldName: MemberOfTest3, Visibility: Published
大家应该知道了吧, 如果没有被{$M+} 修饰过的, 默认是public的, 相反则是published的, 而第2个TPersistent类在classes单元中声明的时候就是已经被{$M+}包裹起来的, 单独给出一个答案的人要被打脸了哦, 偷懒啊 :)
-----------------------------------------------------------
其实大家每天都这样调用form1.button1就能调用,而且button1在DFM文件里有各种属性,所以当然是published。
不过C++属性不加修饰,确实是private,也不知道为啥两者有这个区别?都是OO语言,但是指导思想不一样?
----------------------------------------------------------
什么答案都有, 就是都不愿意动手, 让我们来看看答案是什么吧
implementation uses rtti, typinfo; {$R *.dfm} type TTest1 = class MemberOfTTest1: Integer; end; TTest2 = class(TPersistent) MemberOfTest2: TObject; end; {$M+} TTest3 = class MemberOfTest3: TObject; end; {$M-} TMemberVisibilityHelper = record helper for TMemberVisibility public function ToString: string; end; function TMemberVisibilityHelper.ToString: string; const VisibilityStrings: array [TMemberVisibility] of string = ('Private', 'Protected', 'Public', 'Published'); begin Result := VisibilityStrings[Self]; end; procedure TForm1.ShowMemberOf(const obj: TClass); var rttiContext: TRttiContext; rttiType: TRttiType; rttiField: TRttiField; begin rttiContext := TRttiContext.Create; rttiType := rttiContext.GetType(obj); for rttiField in rttiType.GetFields do begin mmo1.Lines.Add(Format('FieldName: %s, Visibility: %s', [rttiField.Name, rttiField.Visibility.ToString])); end; end; procedure TForm1.btn1Click(Sender: TObject); begin ShowMemberOf(TTest1); ShowMemberOf(TTest2); ShowMemberOf(TTest3); end;
最后程序输出的结果是:
FieldName: MemberOfTTest1, Visibility: Public
FieldName: MemberOfTest2, Visibility: Published
FieldName: MemberOfTest3, Visibility: Published
大家应该知道了吧, 如果没有被{$M+} 修饰过的, 默认是public的, 相反则是published的, 而第2个TPersistent类在classes单元中声明的时候就是已经被{$M+}包裹起来的, 单独给出一个答案的人要被打脸了哦, 偷懒啊 :)
-----------------------------------------------------------
其实大家每天都这样调用form1.button1就能调用,而且button1在DFM文件里有各种属性,所以当然是published。
不过C++属性不加修饰,确实是private,也不知道为啥两者有这个区别?都是OO语言,但是指导思想不一样?
相关文章推荐
- delphi截屏
- delphi 回调函数与函数指针
- DelphiAdo Update Criteria
- delphi将图片存储到sql server 2005
- delphi将汉字转为首字母
- delphi listview自绘图形
- delphi开发学习五:QuickReoprt报表控件使用实例
- Delphi如何从内存流中判断图片格式,MemoryStream
- 开发支付宝支付用DELPHI实现 RSA签名
- delphi编程如何判断图片文件的真实类型?
- Delphi中的for循环本质详解
- 给各位使用delphi借助CEF开发的朋友一个帮助
- delphi开发学习四:TClientDataSet与TDataSetProvider控件使用实例
- delphi TMemoryStream对象用法
- Delphi-string转pbyte的方法——Move函数!
- Delphi流操作技巧
- 在delphi中Char,PChar,PByte,Byte,String的相互转换示例
- delphi中的Label控件背景透明
- Delphi TBitMap 位图组件
- 在非UI线程中更改UI(Delphi使用隐藏窗口来处理,QT使用信号槽)