如何在VB.NET中创建带有隐式实现的接口

6
在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中如何执行此操作)?

@Kris Erickson:我不太理解这个“隐式实现”的概念...无论如何,我想接口必须完全按照与基类相反的方式进行实现。接口将其实现强制到派生类中。如果您只想添加这些方法,我可能会考虑使用一个基本的抽象类(在VBNET中为MustInherit)。这对您的需求足够准确吗? - Will Marcouiller
2个回答

3

不,System.Windows.Forms.Form没有实现FormInterface接口,所以VB.NET无法匹配它们。 VB.NET不支持隐式接口实现,只支持显式接口实现。

是的,您应该创建一个基类并在该基类上实现接口。但我建议将它们的名称稍微改变,例如DoShowDoHide

可以这样做:

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,因为窗体设计器不支持这样做。


0
除非您打算在Form1成员中使用Form类的受保护成员,否则我建议您使用包含关系而不是继承关系。因此,您的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
    }
}

毕竟,如果您计划通过FormInterface类使用Form1实例,那么除了ShowHide之外,您将无法访问Form成员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接