0

我有这个界面:

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 兼容性的目的,我还需要使用 of 类型来实现一个e接口IDocumentCancelEventArgs

Public Sub MySavingHandler(sender As Object, e As IDocumentCancelEventArgs)
    Implements IDocumentSavingHandlerProvider.DocumentSavingHandler

这似乎是不可能的,因为编译器警告我没有DocumentSavingHandler具有该签名的方法。在我看来,在运行时,这不应该是一个问题,因为它肯定MySavingHandler会接受IDocumentSavingEventArgs,因为它是 typeof IDocumentCancelEventArgs

有没有办法做到这一点?

4

2 回答 2

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
于 2013-08-22T17:37:16.973 回答
0

如前所述,编译器是正确的。您需要具有匹配的函数签名。我认为这里可能令人困惑的是,即使您可以将 a 传递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

在后一个函数中,您可以将对象转换为您需要的任何对象,然后将其传递给您的 mainDocumentSavingHandler方法。

于 2013-10-15T13:14:59.970 回答