2013-08-22 30 views
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兼容的目的,我需要使用IDocumentCancelEventArgs類型的e實現後者接口

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

這似乎是不可能的,因爲編譯器警告我沒有該簽名的DocumentSavingHandler方法即 在運行時,這應該不是問題,在我看來,因爲MySavingHandler肯定會接受IDocumentSavingEventArgs,因爲它的類型爲IDocumentCancelEventArgs

有沒有辦法做到這一點?

回答

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方法的對象。

+0

在我看來,你可以傳遞一個'IDocumentSavingEventArgs'到一個接受'IDocumentCancelEventArgs'的函數,而不是像你寫的那樣反過來。 – Teejay

+0

固定,對不起。 – alstonp

+0

謝謝你的回答。不幸的是,重載方式(這似乎是最好的)意味着我必須修改實現'IDocumentSavingHandlerProvider'接口的所有插件。順便說一句,這似乎是獨特的方式。賞金頒發。 – Teejay

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 
+0

這很明顯,我可以使用'IDocumentCancelEventArgs',然後檢查它是不是'IDocumentSavingEventArgs'類型,那不是我想要做的。在我看來,接受更通用的事件參數的方法應該被接受,因爲通常情況下,您可以使用'ID'類型的ID爲'IDocumentCancelEventArgs'或任何該類型的子類來調用'MySavingHandler'。 – Teejay

+0

請注意,在我的代碼中,您不會從'IDocumentCancelEventArgs'轉換爲'IDocumentSavingEventArgs'(可能會失敗),反之亦然(總是允許)。 – Teejay