通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 MY小屋
联系我们
设为首页
加入收藏

 

QQ,ASP,PHP,JSP,XML,SQL,.Net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>编程开发>>DELPHI>>正文 新版上线![旧版]
注:打开慢时请稍等

Delphi学习:OOP 中的双刃剑

http://www.iyit.net  日期:2006-6-2 17:43:08  来源:  点击:
参加讨论

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

   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;

本新闻共2页,当前在第1页  1  2  


编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:Delphi快速入门(一)
下一篇:没有了
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
Delphi中的Access技巧集 使用Delphi6的DBExpress组件连接远程的 通过 Delphi实现 Java调用 Oracle数据库
Delphi快速入门(一) Delphi快速入门(二) Delphi快速入门(三)
Delphi快速入门(四) Delphi快速入门(五) Delphi快速入门(六)
Delphi快速入门(七) Delphi面向对象的编程方法(一) Delphi面向对象的编程方法(二)
Delphi面向对象的编程方法(三) Delphi面向对象的编程方法(五) Delphi面向对象的编程方法(六)
Delphi面向对象的编程方法(七) Delphi字符串列表及应用(一) Delphi字符串列表及应用(二)
Delphi文本编辑器的设计(一) Delphi文本编辑器的设计(二) Delphi 文本编辑器的设计(三)
Delphi 文本编辑器的设计(四) Delphi图形图像编程(一) Delphi图形图像编程(二)
最新更新 热点排行 推荐新闻
Delphi学习:OOP 中的双刃剑
Delphi快速入门(一)
Delphi快速入门(二)
Delphi快速入门(三)
Delphi快速入门(四)
Photoshop实例教程打造爆炸效果
Photoshop精彩特效:琥珀文字
Photoshop打造超强质感白金苹果
Photoshop人物照片换头术
像素风格纹理背景图案制作技巧
为自己的照片画一张京剧脸谱
Photoshop轻松制作炫光特效
Photoshop文字特效:蓝冰文字
Photoshop为水龙头添加逼真流水特效
Photoshop路径与滤镜绘制透明光影花叶
第二十章 开发Delphi对象式数据管理功
第一章 Delphi快速入门(三)
开发Delphi对象式数据管理功能(十)
第一章 Delphi快速入门(五)
Delphi面向对象的编程方法(二)
优秀公益广告作品欣赏(8)
java数据类型转换
QQ最新版下载 2006 beta2 体验新感受 
Windows XP专业版IIS连接数的更改
优秀公益广告作品欣赏(7)
Office2007简体中文版浮出水面 美图抢
优秀公益广告作品欣赏(6)
优秀公益广告作品欣赏(4)
WEB服务器配置全攻略(三)
优秀公益广告作品欣赏(1)
第二十章 开发Delphi对象式数据管理功
在ASP.NET中防止注入攻击
用ASP.NET开发Web服务的五则技巧
Linux操作系统12则经典应用技巧
浅谈Linux优化及安全配置的个人体会
解决局域网不能互相访问之全攻略
WIN 2000简单的入侵常识
用Win 2003架设邮件服务器
硬盘分区消失,解决方法!
传统计算机病毒传播能力破坏性在提高
内存为何有“两面性”
 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyrights © 2004-2006 iYiT.Net All Rights Reserved.
网站合作、广告联系QQ:147007642、466949678
易特网络技术 点击这里给我发消息