2013-08-22 6 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, мне нужно реализовать последний интерфейс также используя e типа IDocumentCancelEventArgs:

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', что я не хочу делать. На мой взгляд, метод, принимающий более общие аргументы событий, должен приниматься, так как обычно вы можете называть 'MySavingHandler'' '' 'типом' IDocumentCancelEventArgs' или любым подклассом этого типа. – Teejay

+0

Обратите внимание, что в моем коде вы не выбрали бы из 'IDocumentCancelEventArgs' для' IDocumentSavingEventArgs' (который может завершиться с ошибкой), но наоборот (что всегда разрешено). – Teejay

Смежные вопросы