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

我们知道,对于DELPHI来说,同一个单元中的类都互为友元,可以互相访问彼此的非public方法和属性,子类也可以访问父类private下的属性方法。虽然从单元内部讲,这似乎不是很符合封装的原则,容易引起初学者的混乱。只有在某些特殊设计(如刘艺举例的那个备忘录模式),或为了让两个类更紧耦合一点时,才应使用此“特性”。

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

然而,是不是真的是这样呢?今天在看某个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类型),不过不排除有时这么用法会存在点副作用,毕竟有点旁门左道。

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

你可能感兴趣的:(Delphi技术,Delphi,面向对象编程,OOP)