程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi學習:OOP 中的雙刃劍 (1)

Delphi學習:OOP 中的雙刃劍 (1)

編輯:Delphi
前幾天看一份非常有名的商業控件的源碼,發現一個非常有趣的用法:


  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 := @
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved