4221学习网
首页 | 网址大全 | 脑力倍增 | 电脑学院 | 学习方法 | 英语学习 | 口才交际 | 工作职场 | 成功励志 | 文学小说 | 视频教程 | 视频短片 | 下载中心 | NBA | 奥运 | 图片专区 | QQ·技巧 | 游戏技巧 | 恋爱技巧 | 谈天说地 | 专题教程 | 4221论坛
热门关键字: 视频教程  百家讲坛  美女  记忆力  疯狂英语
 → 当前位置:4221学习网>电脑学院>编程开发>Delphi教程>正文

Delphi学习:OOP 中的双刃剑

4221学习网 2007-06-08 来源:互联网 收藏本文

训练30小时,让阅读提速5-10倍!---速读记忆训练软件免费下载!(点击下载)

 

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

   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);
  finally
    Free;
  end;
end;

   至于“踩过界”那更不在话下:
 
 procedure TForm1.Button5Click(Sender: TObject);
var
  p1, p2: PInteger;
begin
  with TTestCls.Create do
  try
    p1 := @(Inner.A);
    // 内存中 FInner 与 FReadOnlyValue 其实只差 TTestRec 大小个字节
    Integer(p2) := Integer(p1) + SizeOf(TTestRec);
    Integer(p2^) := 100;
    Caption := TButton(Sender).Caption + ’ ReadOnlyValue := ’ + IntToStr(ReadOnlyValue);
  finally
    Free;
  end;
end;

   当然,指针不但可以破坏 oo,也能使您的代码更加的 oo:
 
  TTestRec = record
    A, B, C: Integer;
  end;
  PTestRec = ^TTestRec;
 
  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;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  with TTestCls.Create do
  try
    NewInner.A := 10;
    Caption := TButton(Sender).Caption + ’ A := ’ + IntToStr(Inner.A);
  finally
    Free;
  end;
end;

 

   看看现实中的非 oo 的代码:
 
  利用“指针方案”把 Txxx 改成 Pxxx 后竟然对原来的代码一点影响都没有,而使之更加的 oo

上一篇:通用Delphi数据库输入控件DBPanel的实现   下一篇:Delphi编程实现Ping操作
添加到google书签 digg this! 添加到bolaa 添加到yahoo+ 添加到新浪vivi 添加到365key  
收藏】 【评论】 【推荐】 【投稿】 【打印】 【关闭

相关文章
·通用Delphi数据库输入控件DBPanel的实现
·Delphi编程实现Ping操作
·Delphi控件的使用经验
·Delphi简介
·Delphi快速入门教程(五)
·Delphi快速入门教程(四)
·Delphi快速入门教程(三)
·Delphi快速入门教程(二)
·Delphi快速入门教程(一)
发表评论
要记得去论坛讨论,点击注册新会员) 密码: 匿名评论
评论内容:(请自觉遵守互联网相关政策法规。)
最新文章
·Delphi快速入门教程(一)
·Delphi快速入门教程(二)
·Delphi快速入门教程(三)
·Delphi快速入门教程(四)
·Delphi快速入门教程(五)
·Delphi简介
·Delphi编程实现Ping操作
·通用Delphi数据库输入控件DBPanel的实现
·Delphi控件的使用经验
本类阅读排行榜
·Delphi控件的使用经验
·通用Delphi数据库输入控件DBPanel的实现
·Delphi快速入门教程(一)
·Delphi编程实现Ping操作
·Delphi简介
·Delphi快速入门教程(五)
·Delphi快速入门教程(四)
·Delphi快速入门教程(二)
·Delphi快速入门教程(三)
热点视频教程
视频街舞 舞步 教学
视频windowsxp重装系统视频教程
视频李孝利十分钟详细舞蹈教程
视频美女教你跳舞
视频街舞 舞步 教学2
视频双截棍视频教程-定式
视频如何安装双操作系统
视频韩国的太空步教程,后滑、侧滑、旋转太空
视频【WindowsXP入门教程】 - 硬盘分区
视频台球教程-基本杆法
视频[百家讲坛]三十六计01_借刀杀人
视频24式太极拳教学---基本动作
视频 斯诺克台球竿法-后退球
视频动物世界之决战生死线2
视频超级全脑速读训练教程

设为首页 - 加入收藏 - 关于我们 - 联系我们 - 友情连接

4221学习网版权所有-鄂ICP备07006816号
已浏览: