2013-04-19 2 views
1

Я интерфейс, определенный в C# проекта:реализация интерфейса в C# и VB.NET

public interface IForm 
{ 
    bool IsDisposed { get; } 
    void Show(); 
} 

я реализовал его в C# класса в WinForms

public partial class Form1 : Form, IForm { } 

Как метод Show() и имущества IsDisposed уже присутствуют в классе System.Windows.Forms.Form, я не требую его реализации.

Но это не верно в VB.NET, в VB.NET Мне нужно определить элементы, в противном случае получить ошибку компиляции.

Public Class Form1 
    Implements WindowsFormsApplication1.IForm 

    Public ReadOnly Property IsDisposed1 As Boolean Implements WindowsFormsApplication1.IForm.IsDisposed 
     Get 

     End Get 
    End Property 

    Public Sub Show1() Implements WindowsFormsApplication1.IForm.Show 

    End Sub 
End Class 

Почему я должен определять члены интерфейса в VB.NET, если они уже присутствуют в базовом классе?

+4

Я не вижу, где ваш класс VB.NET наследует от 'System.Windows.Form'. – Oded

+0

Два языка имеют разные правила. Это неудивительно. Если бы они были одинаковыми во всех отношениях, они не были бы * двумя языками. –

+3

@Oded: Я предполагаю, что он создал форму с дизайнером (или, возможно, это было там, когда вы создаете новое приложение vb), что означает, что оператор 'Inherits Form' находится в' Form1.Designer.vb 'файл. – Pondidum

ответ

8

VB не имеет неявной реализации интерфейса, только явный, в то время как C# поддерживает оба.

Это означает, что вы должны явно указать, какой именно элемент реализует элемент интерфейса. Это добавляет некоторую гибкость, например, вы можете сделать метод, который реализует элемент интерфейса, закрытый или защищенный, и вы можете дать ему имя, которое отличается от члена интерфейса.

Вы можете прочитать больше о деталях этого здесь: http://ondevelopment.blogspot.se/2008/10/implementing-interfaces-in-vbnet.html

+0

На флипсайде vb.net позволяет использовать метод, который реализует интерфейс, чтобы иметь видимость, отличную от «public» или «none». ИМХО, в наследуемом классе, если видимость не является «общедоступной», она должна чаще всего «защищаться» [обычно с использованием слегка измененного имени], поскольку производным классам часто необходимо модифицировать поведение метода, не заменяя его полностью , Способ C# делает вещи, явная реализация интерфейса родительского класса не может использоваться из реализации дочернего класса. – supercat

2

VB.NET позволяет назвать функцию/суб-другому, чем функция/к югу, что он реализует. Это означает, что вы должны явно добавить Implements <Function/Sub> в конец подписи.

В C# вы не можете этого сделать, поэтому реализации «просто работают» без необходимости добавлять что-либо.

MSDN:

типы параметров и типы реализующего элемента должны соответствовать свойству интерфейса или декларации члена в интерфейсе возврата. Наиболее распространенным способом реализации элемента интерфейса является член, имеющий то же имя, что и интерфейс

+1

Вы можете реализовать интерфейс явно в C#, для метода задано полное синтаксис InterfaceName.MethodName – tolanj

1

Используйте ключевое слово тени, если вы хотите переопределить стандартные методы формы и заменить их на те, определенные в вашем интерфейсе, иначе вам нужно использовать другое имя, поскольку они рассматриваются как два отдельных метода.

Public Class Form1 
    Inherits Form 
    Implements IForm 

    Public Shadows Property IsDisposed As Boolean Implements IForm.IsDisposed 

    Public Shadows Sub Show() Implements IForm.Show 
     ' replaces original method in Form class 
    End Sub 

End Class 

Альтернатива:

Public Class Form2 
    Inherits Form 
    Implements IForm 

    Public Property IsDisposed1 As Boolean Implements IForm.IsDisposed 

    Public Sub Show1() Implements IForm.Show 
     Me.Show() ' Original method still exists and is accessible like this 
    End Sub 
End Class 
+0

Я действительно хочу, чтобы 'ShowDialog',' Show' и 'Close' были отмечены как' Overrideble' по этой причине, я ненавижу теневое обращение методы :( – Pondidum

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