C#和VB.NET中的接口实现

时间:2013-04-19 12:50:57

标签: c# vb.net interface

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

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

我在WinForms

中的C#类中实现了它
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中定义接口成员(如果它们已经存在于基类中?

3 个答案:

答案 0 :(得分:8)

VB没有隐式接口实现,只有在C#支持两者时才显式。

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

您可以在此处详细了解详情:http://ondevelopment.blogspot.se/2008/10/implementing-interfaces-in-vbnet.html

答案 1 :(得分:2)

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

在C#中你不能这样做,所以实现“只是工作”而你不必添加任何东西。

MSDN

  

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

答案 2 :(得分: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