我有一个Delphi表单,它提供了一个接口对象背后的功能,代码的其他部分也通过属于Form的属性获得引用.我不能将接口功能委托给子对象,因为窗体上的控件/组件提供了太多的功能.我不能使用TAggregatedObject或TContainedObject来链接传递给接口的对象的生命周期,因为TForm类不继承TinterfacedObject而Delphi不支持多重继承,所以我不能将TInterfacedObject混合到继承链中.如果表单被销毁而某些其他代码保存表单传递的一个接口引用,则此情况可能导致访问冲突.谁能想到这个问题的好方法呢?
解决方法
您可以将接口委托给子对象,只需让该对象包含一个指向Form的内部指针,这样它就可以在需要时访问Form的控件,这与您现在已经在做的没有什么不同.
您可以根据需要使用TAggregateObject或TContainedObject.它们不要求Form从TInterfacedObject派生.他们所需要的只是一个IInterface接口指针,TComponent来自IInterface(并覆盖_AddRef()和_Release()以禁用引用计数),因此您可以将Form本身(作为TComponent后代)作为所需的IInterface指针传递.
这留下了唯一的问题 – 当活动接口引用被其他代码保存时,表单关闭.最简单的解决方案是:1)在Form关闭时重写代码以不保留那些引用,或者2)在这些引用被释放之前不允许Form关闭.