1

我在C#项目中定义了一个接口:

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

C#在 WinForms 的一个类中实现了它

public partial class Form1 : Form, IForm {  }

由于方法Show()和属性IsDisposed已经存在于System.Windows.Forms.Form类中,我不需要实现它。

但同样不适用VB.NETVB.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

3 回答 3

8

VB 没有隐式接口实现,只有显式接口实现,而 C# 两者都支持。

这意味着您必须明确说明实现接口成员的确切成员。这增加了一些灵活性,例如,您可以将实现接口成员的方法设为私有或受保护,并且可以为其命名与接口成员不同的名称。

您可以在此处阅读有关此详细信息的更多信息:http: //ondevelopment.blogspot.se/2008/10/implementing-interfaces-in-vbnet.html

于 2013-04-19T12:55:27.747 回答
2

VB.NET 允许您以不同于它实现的函数/子的方式命名函数/子。这意味着您必须Implements <Function/Sub>在签名的末尾显式添加 。

在 C# 中,您不能这样做,因此实现“正常工作”而无需添加任何内容。

MSDN

实现成员的参数类型和返回类型必须与接口中的接口属性或成员声明相匹配。实现接口元素的最常见方法是使用与接口同名的成员

于 2013-04-19T12:55:34.857 回答
1

如果要覆盖 Form 的标准方法并将其替换为接口中定义的方法,请使用 shadows 关键字,否则您需要使用不同的名称,因为它们被视为两个单独的方法。

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
于 2013-04-19T13:03:37.887 回答