在C#中,我可以创建一个接口,当我使用该接口时,编译器知道基类满足了某些接口要求。这可能更清楚,例如:
interface FormInterface
{
void Hide();
void Show();
void SetupForm();
}
public partial class Form1 : Form, FormInterface
{
public Form1()
{
InitializeComponent();
}
public void SetupForm()
{
}
}
编译器知道Hide()和Show()是在Form中实现的,上面的代码编译得很好。我无法弄清楚如何在VB.NET中这样做。当我尝试:
Public Interface FormInterface
Sub Hide()
Sub Show()
Sub SetupForm()
End Interface
Public Class Form1
Inherits System.Windows.Forms.Form
Implements FormInterface
Public Sub SetupForm() Implements FormInterface.SetupForm
End Sub
End Class
但编译器抱怨Form1必须为接口'FormInterface'实现'Sub Hide()'。我实际上是否必须添加以下内容?
Public Sub Hide1() Implements FormInterface.Hide
Hide()
End Sub
在我的所有表单上,或者是创建具有SetupForm()的抽象基类的更好的路径(以及如何在VB.NET中执行此操作)?
答案 0 :(得分:3)
不,System.Windows.Forms.Form
没有实现FormInterface,因此VB.NET不知道它们匹配。 VB.NET不做隐式接口实现,只是显式。
是的,您应该创建一个基类并在其上实现您的接口。但是,我会将它们命名为略有不同。也许DoShow
和DoHide
。
这样的事情:
Public Class BaseForm
Inherits System.Windows.Forms.Form
Implements FormInterface
Public Sub SetupForm() Implements FormInterface.SetupForm
End Sub
Public Sub DoShow() Implements FormInterface.DoSHow
Me.Show()
End Sub
Public Sub DoHide() Implements FormInterface.DoHide
Me.Hide()
End Sub
End Class
否则你可以偶然做到这一点:
Public Class BaseForm
Inherits System.Windows.Forms.Form
Implements FormInterface
Public Sub SetupForm() Implements FormInterface.SetupForm
End Sub
Public Sub Show() Implements FormInterface.SHow
Me.Show()
End Sub
Public Sub Hide() Implements FormInterface.Hide
Me.Hide()
End Sub
End Class
那会崩溃并燃烧。
不要创建基类MustInherit,因为表单设计者不会喜欢它。
答案 1 :(得分:0)
除非您打算在Form
成员中使用Form1
类的受保护成员,否则我将使用包含关系而不是继承。因此,您的FormInterface
会被命名为IFormWrapper
,而您的实现将是这样的(我在C#中显示它,因为它是我的工作语言,我认为您将能够翻译这个想法到VB):
public class Form1 : IFormWrapper
{
private readonly Form form;
public Form1 {
this.form=new Form();
}
public void Show() {
form.Show();
}
public void Hide() {
form.Hide();
}
public void SetupForm() {
//Code for the setup method
}
}
毕竟,如果您计划在Form1
课程中使用FormInterface
个实例,那么除了Form
和Show
以外,您将无法访问Hide
个成员{1}}。