类的私有和保护的部分只对于其他单元中的类和过程才是隐藏的..
规则18:保护域中的访问方法(Protected Access Methods)
在基类中将组件参照放置在私有域中,而为这些组件添加一些访问函数来得到他们的属性,这将是一种更好的方法。如果这些访问函数仅仅在这些类内部使用而且不是类接口的一部分,你应该在保护域声明他们。例如Rule 11中描述过的GetText和SetText方法就可以声明成protected,并且我们可以通过调用SetText(’’)来编辑文本。
事实上,当一个方法被镜像到一个属性时,我们可以简单地采用如下代码就可以达到编辑文本地目的:
Text:=’’;
规则19:保护域中的虚拟方法(Protected Virtual Methods) 实现一个灵活的分级制度的另一个关键点是定义一些你可以从外部类调用的虚拟方法来得到多态性。如果这个方法使用得当,将会很少出现其他公共的方法调用保护域中的虚拟方法的情况。这是一个重要的技巧,因为你可以定制派生类的虚拟方法,来修改对象的动作。
规则20:用于属性的虚拟方法(Virtual Methods For Properties) 即使是访问属性的方法也能定义成virtual,这样派生类就能改变属性的动作而不必重定义他们。虽然这种方法在VCL当中很少使用,但是它确实十分灵活、强大。为了实现这一点,仅仅需要将Rule 11当中的Get 和Set 方法定义成Virtual。基类的代码如下所示:
type TformDialog = class ( TForm) Procedure FormCreate(Sender:Tobject); Private Edit1:Tedit; Protected function GetText:String;virtual; procedure SetText(const Value:String);virtual; public constructor Create(Text :String):reintroduce;overload; property Text:String read GetText write SetText; end; |
在继承窗体中,你可以添加一些额外的动作来重载虚拟方法SetText:
procedure TformInherit.SetText(const Value:String); begin inherited SetText(Value); if Value=’’ then Button1.Enabled:=False; end; |
小结 要做到一个好的Delphi面向对象编程程序员远非我在上面提到的这些规则这么简单。上面的这20条规则中有一些可能需要足够的耐性和时间来实现,因此,我也不能强求你能遵循所有的这些规则。但是这些规则应该被合适的运用到你的程序中,而且当你开发的应用程序越大,参与的程序员越多,这些规则越重要。不过,即使是一些小程序,始终记住这些规则并在合适的地方使用他们也会对你有所帮助。
当然,还有很多其他的经验规则我没有涉及到,特别是存储器处理和RTTI问题,因为他们十分的复杂,需要专门的说明。
我的结论是要遵循我上面列出的规则会付出一定的代价,特别是额外的代码,但是这些代价会让你得到一个更加灵活强壮的程序。希望Delphi的后续版本能够帮组我们减少这些代价。
查看本文来源