您现在的位置:首页 >> 基础算法 >> window基础 >> 内容

Delphi中跨单元访问其它类protected下的属性方法

时间:2011/9/3 15:32:59 点击:

  核心提示:虽然从单元内部讲,这似乎不是很符合封装的原则,容易引起初学者的混乱。只有在某些特殊设计(如刘艺举例的那个备忘录模式),或为了让两个类更紧耦合一点时,才应使用此“特性”。不过跨单元后,此“特性”便会消失...
虽然从单元内部讲,这似乎不是很符合封装的原则,容易引起初学者的混乱。只有在某些特殊设计(如刘艺举例的那个备忘录模式),或为了让两个类更紧耦合一点时,才应使用此“特性”。

  不过跨单元后,此“特性”便会消失,一切重新遵循回标准的面向对象原则。

  然而,是不是真的是这样呢?今天在看某个RZ的单元时,看到了一个比较有趣的小技巧:原本B单元的TClassB是不能访问A单元TClassA的非public属性方法的,然而它在B单元中声明了一个继承TClassA的类叫TClassAAccess,什么东西都不添加。这样,由于现在TClassC和TClassAAccess成了友元关系了,因此TClassC便等于说可以访问到TClassA里非private下的任何东西了,只需把TClassA的类“转型”成TClassAAccess即可。

  那么这个小技巧什么时候有空呢?例如说,我们知道Caption和Text在TControl类中是protected的,没有说到了哪个公共子类才开始公布这个属性,然后所有类都继承这个公共子类。所以如果要给一堆控件设置Text或Caption时,一般的写法就是if AObject is TCustomEdit then xxx、if AObject is TCustomPanel then、if AObject is TCustomLabel then等等一堆if语句,扩展性并不好,聪明一点的写法就是用RTTI。但是如果借助这个小技巧,我们就可以直接TControlAccess(AControl).Caption := 'ok'了(AControl是TControl类型),不过不排除有时这么用法会存在点副作用,毕竟有点旁门左道。

  不过,这些“小技巧”应该只是作为一种锦上添花的手段,平时写代码和解决代码,还是应该遵循正道滴。

作者:harryfin 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2020 版权所有 All Rights Reserved.
  • 沪ICP备05001939号