繁体   English   中英

用更通用的方法实现接口

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM