Delphi学习:OOP 中的双刃剑

2008-02-23 07:18:37来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

1 2 下一页

  前几天看一份非常有名的商业控件的源码,发现一个非常有趣的用法:



  Integer(xxx) := aaa;
  Tttt(xxx) := bbb;
  细细品味,发现利用这种用法往往可以收到意想不到的效果:
  比如:




TTestRec = record
A, B, C: Integer;
end;
TTestCls = class
private
FInner: TTestRec;
FReadOnlyValue: Integer;
function GetNewInner: PTestRec;
public
property Inner: TTestRec read FInner write FInner;
property NewInner: PTestRec read GetNewInner;
property ReadOnlyValue: Integer read FReadOnlyValue;
end;
  你会发现,直接的你是改不了 aTestCls.Inner.A 的(编译时 Delphi 直接报错,因为 delphi 7 中两个 recode 赋值是 copy memory 而不是简单的“传址”!

procedure TForm1.Button1Click(Sender: TObject);
begin
with TTestCls.Create do
try
// Inner.A := 10;
Caption := TButton(Sender).Caption ' A := ' IntToStr(Inner.A);
finally
Free;
end;
end;
  可是,如果我们知道在访问这个 Inner 时 delphi 在编译直接 FInner 的地址,那么,结合上面那种有趣的用法:

procedure TForm1.Button3Click(Sender: TObject);
var
p: PInteger;
begin
with TTestCls.Create do
try
p := @(Inner.A);
Integer(p^) := 100;
Caption := TButton(Sender).Caption ' A := ' IntToStr(Inner.A);
finally
Free;
end;
end;
  更进一步,利用指针竟然可以突破 oo 对 private 的保护:

procedure TForm1.Button4Click(Sender: TObject);
var
p: PInteger;
begin
with TTestCls.Create do
try
p := @(ReadOnlyValue);
Integer(p^) := 1000;

Caption := TButton(Sender).Caption ' ReadOnlyValue := ' IntToStr(ReadOnlyValue);

上一篇: 用Delphi制作DLL的方法
下一篇: 教你如何用Delphi注册快捷方式

1 2 下一页

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:利用Delphi编写Socket通信程序

下一篇:在 NT内核的操作系统上实现系统关闭