使用更通用的方法实现接口

时间:2013-08-22 13:01:52

标签: vb.net inheritance interface .net-3.5 polymorphism

我有这个界面:

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

有没有办法实现这个目标?

2 个答案:

答案 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方法。