c#和VB.NET的接口实现

本文关键字:接口 实现 NET VB | 更新日期: 2023-09-27 18:09:57

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

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

我在WinForms的C#类中实现了它

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中定义接口成员。

c#和VB.NET的接口实现

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

这意味着您必须明确地说明实现接口成员的成员是什么。这增加了一些灵活性,例如,您可以使实现接口成员的方法私有或受保护,并且可以给它一个不同于接口成员的名称。

您可以在这里阅读更多详细信息:http://ondevelopment.blogspot.se/2008/10/implementing-interfaces-in-vbnet.html

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

在c#中你不能这样做,所以实现"只是工作"而不需要添加任何东西。

MSDN:

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

同名的成员。

如果你想覆盖表单的标准方法并将其替换为接口中定义的方法,则使用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