我有这个界面:
Public Interface IDocumentSavingEventArgs
Inherits IDocumentCancelEventArgs
Property SuggestedDocName As String
Property SuppressSaveDialog As Boolean
End Interface
如图所示,继承自更通用的接口IDocumentCancelEventArgs
。
然后我有这个界面:
Public Interface IDocumentSavingHandlerProvider
Inherits IProvider
Sub DocumentSavingHandler(sender As Object, e As IDocumentSavingEventArgs)
End Interface
对于旧的pulgins兼容性目的,我需要使用类型为e
的{{1}}实现后一个界面 :
IDocumentCancelEventArgs
这似乎不可能,因为编译器警告我没有带有该签名的Public Sub MySavingHandler(sender As Object, e As IDocumentCancelEventArgs)
Implements IDocumentSavingHandlerProvider.DocumentSavingHandler
方法。
在运行时,我认为这应该不是问题,因为DocumentSavingHandler
肯定会接受MySavingHandler
,因为它的类型为IDocumentSavingEventArgs
。
有没有办法实现这个目标?
答案 0 :(得分:0)
编译器是正确的,因为IDocumentCancelEventArgs不从IDocumentSavingEventArgs继承,所以它不能转换为IDocumentSavingEventArgs。然后,如果e是IDocumentCancelEventArgs或IDocumentSavingEventArgs,则可以在实现中进行测试。
您需要使用最小公分母IDocumentCancelEventArgs
Public Interface IDocumentSavingHandlerProvider
Inherits IProvider
Sub DocumentSavingHandler(sender As Object, e As IDocumentCancelEventArgs)
End Interface
Public Sub DocumentSavingHandler(sender As Object, e As IDocumentCancelEventArgs) Implements IDocumentSavingHandlerProvider.DocumentSavingHandler
Dim saveEventArgs As IDocumentSavingEventArgs
If TypeOf e Is IDocumentSavingEventArgs Then
saveEventArgs = DirectCast(e, IDocumentSavingEventArgs)
Else
' Do something else....
End If
End Sub
答案 1 :(得分:0)
如前所述,编译器是正确的。您需要具有匹配的功能签名。我认为这里可能令人困惑的是,即使您可以将IDocumentSavingEventArgs
传递给接受IDocumentCancelEventArgs
的函数,编译器也会将这些定义视为两个独立的函数。如果你想要更通用的东西,你可能不得不将这些接口抽象到另一个接口,我不建议这样做,因为它很快就无法维护,或者你可以在界面中创建一个重载函数。
Public Interface IDocumentSavingHandlerProvider
Inherits IProvider
Sub DocumentSavingHandler(sender As Object, e As IDocumentSavingEventArgs)
Sub DocumentSavingHandler(sender As Object, e As IDocumentCancelEventArgs)
End Interface
在后一个函数中,您可以将对象转换为您需要的对象,然后将其传递给主DocumentSavingHandler
方法。