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

Posted

技术标签:

【中文标题】如何在 VB.NET 中创建具有隐式实现的接口【英文标题】:How can I create an interface in VB.NET with implicit implementations 【发布时间】:2010-12-13 17:54:45 【问题描述】:

在 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)。这是否足以满足您的需求? 【参考方案1】:

除非您打算在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 成员。

【讨论】:

【参考方案2】:

不,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,因为表单设计者不喜欢这样。

【讨论】:

以上是关于如何在 VB.NET 中创建具有隐式实现的接口的主要内容,如果未能解决你的问题,请参考以下文章

vb.net 如何在一个项目中创建类,并且使用他?

如何在一个ViewController中创建实现多协议?

在visual basic(而不是VB.net)中创建一个错误弹出框

如何在 Web ASP.NET (.NET Framework) 中创建启动文件?

使用vb.net在oracle中创建函数[重复]

在 VB.NET 中创建 DLNA 服务器/服务 [关闭]