[英]Implementing an interface with more general methods
我有这个界面:
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
类型的IDocumentCancelEventArgs
:
Public Sub MySavingHandler(sender As Object, e As IDocumentCancelEventArgs)
Implements IDocumentSavingHandlerProvider.DocumentSavingHandler
这似乎是不可能的,因为编译器警告我没有带该签名的DocumentSavingHandler
方法。 在我看来,在运行时这应该不是问题,因为MySavingHandler
可以肯定接受IDocumentSavingEventArgs
,因为它的类型为IDocumentCancelEventArgs
。
有没有办法做到这一点?
编译器是正确的,因为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
如前所述,编译器是正确的。 您需要具有匹配的功能签名。 我认为可能令人困惑的是,即使您可以将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
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.