我在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.NET中定义接口成员(如果它们已经存在于基类中?
)答案 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