【问题标题】:A case for interface?接口案例?
【发布时间】:2017-09-12 14:34:03
【问题描述】:

我有一个类应该用表单做不同的事情。

因为这些“东西”是特定于表单的,所以我这样存储对表单的引用:

Friend Class clsEdit

    Private m_Form As frmMain

然后我像这样将它传递给班级:

Public Sub New(ByRef uForm As frmMain)

    m_Form = uForm

End Sub

现在当我的班级应该做这些“事情”时,我会这样做:

MyEditClass.DoThings()

内部是这样的:

Public Sub DoThis()

    m_Form.SetHookPaused(True) 
    m_Form.StopCommonTimers()

End Sub

Protected Overrides Sub Finalize()
    m_Form.DoSomethingThatOnlyThisFormCanDo()
End Sub

我现在也希望能够在不同的表单上使用 clsEdit。 这种另一种形式也有函数“DoThings”和“DoSomethingThatOnlyThisFormCanDo”。

但是,当我将 m_Form 的声明更改为此

Private m_Form As Form

...我不能再这样做了:

m_Form.DoThings()

...因为“DoThings”不是“Form”的属性/功能。

当我把它改成这样时:

Private m_Form As frmOther

...我不能再这样做了:

Public Sub New(ByRef uForm As frmMain)

    m_Form = uForm

End Sub

谁能告诉我如何做到这一点?

【问题讨论】:

  • 表单已经是一个类。您可以只向表单添加方法,而不是将其隐藏在另一个类中。不确定 Interfaces 如何在您的帖子中发挥作用。
  • 是的,如果你有两个不同的表单具有相同的方法和功能,那么创建一个接口并使用它来代替。
  • 你能给我一个关于这个案例的界面的kickstart吗?

标签: vb.net interface


【解决方案1】:

创建你的界面:

Public Interface IFormStuff
  Sub SetHookPaused(value As Boolean)
  Sub StopCommonTimers()
End Interface

用类中的Interface变量替换form变量:

Public Class clsEdit
  Private m_Form As IFormStuff

  Public Sub New(f As IFormStuff)
    m_Form = f
  End Sub

  Public Sub DoThis()
    m_Form.SetHookPaused(True)
    m_Form.StopCommonTimers()
  End Sub
End Class

在每个表单中实现接口:

Public Class Form1
  Implements IFormStuff

每个表单都需要实现这些接口存根:

Public Sub SetHookPaused(value As Boolean) Implements IFormStuff.SetHookPaused
  ' do something
End Sub

Public Sub StopCommonTimers() Implements IFormStuff.StopCommonTimers
  ' do something
End Sub

那么你需要在表单级别创建类:

Private myEdit As clsEdit = Nothing

Protected Overrides Sub OnLoad(e As EventArgs)
  MyBase.OnLoad(e)
  myEdit = New clsEdit(Me)
End Sub

这就是它的要点。

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 2013-03-25
    • 2011-07-18
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2017-02-10
    • 1970-01-01
    相关资源
    最近更新 更多