2015-12-05 4 views
1

VB.NETVB.NET WinForms, реализующего интерфейс

Я хочу, чтобы некоторое WinForms реализовать интерфейс, и быть в состоянии передать их к процедуре, которая может «видеть» реализованные свойства, а также «стандартные методы 'формы. Это то, что я до сих пор ...

Public Interface IMyInterface 

    Property MyProperty As String 

End Interface 

Public Class MyForm 

    Implements IMyInterface 

    Private _MyProperty As String 

    Public Property MyProperty() As String Implements IMyInterface.MyProperty 
    Get 
     Return _MyProperty 
    End Get 
    Set(ByVal value As String) 
     _MyProperty = value 
    End Set 

End Property 

End Class 

тогда, в другом месте у меня есть метод, как следует ...

Public Sub DoSomething(MyForm As IMyInterface) 

    MyForm.MyProperty = "x" 
    MyForm.ShowDialog() 

End Sub 

Очевидная проблема заключается в том, что компилятор не знает, что .ShowDialog есть, и если я передам свою форму в виде «MyForm As Form», он не знает, что такое «MyProperty». Я понимаю причины этого, но не как решить эту проблему. Является ли простой листинг для Формирования правильного способа решения этой проблемы?

Большое спасибо.

+0

Вы можете, конечно, добавить интерфейс ShowDialog или Display к интерфейсу. Или даже метод GetForm. Но что будет дальше? Обычной точкой показа диалогового окна является получение данных, введенных пользователем после его показа. Поэтому вы должны объявить POCO, который хранит эти данные, и метод Boolean GetData (Poco data) начинает иметь смысл. Теперь полная информация о том, как эти данные будут получены, вы должны использовать ShowDialog при обычном использовании и макет в модульном тесте. –

ответ

0

Вам необходимо наследовать System.Windows.Forms.Form, чтобы получить все функции регулярной формы, а затем выполнить IMyInterface.

Public Class MyForm 
    Inherits System.Windows.Forms.Form 
    Implements IMyInterface 

Передача MyForm As IMyInterface в метод DoSomething() прекрасно, однако использовать обычные методы формы вам нужно, чтобы бросить его. В качестве альтернативы вы можете пройти в Form, а затем отправить на IMyInterface, на ваш выбор.

Public Sub DoSomething(MyIForm As IMyInterface) 
     MyIForm.MyProperty = "x" 

     Dim MyForm As Form = TryCast(MyIForm, Form) 
     MyForm.ShowDialog() 
0

Другой Подход может быть с помощью своего базового класса

Public Class MyBaseForm 
    Inherits System.Windows.Forms.Form 

    Public Property MyProperty As String 

End Class 

Тогда все ваши формы могут наследовать, что основная форма

Public Class MyForm 
    Inherits MyBaseForm 

End Class 

И вы можете использовать свойство и стандартный метод System.Windows.Forms.Form без литье

Public Sub DoSomething(someform As MyForm) 
    someform.MyProperty = "Some value" 
    someform.ShowDialog() 
End Sub 
Смежные вопросы