【问题标题】:VB.NET Class with no constructor (no new instance can be declared)没有构造函数的 VB.NET 类(不能声明新实例)
【发布时间】:2026-01-06 07:35:01
【问题描述】:

我正在制作我自己的消息框类(称为 MessageBoxC,等等),并且像 System.Windows.Forms.MessageBox 一样,我想让我的类没有构造函数并且不可能声明它的新实例。

例如:

Public Class MessageBoxC
   Public Overloads Sub Show(ByVal message As String)
      Me.Message = message
      ProcessData()   '(*)
      Me.ShowDialog()
   End Sub
End Class

Public Class Form1
   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      System.Windows.Forms.MessageBox.Show("Hello World!") 'works fine
      MessageBoxC.Show("Hello World!") 'works fine

      Dim msgBox As New System.Windows.Forms.MessageBox    'and you'll get an error message here (**)
      Dim msgBoxC As New MessageBoxC    'no error message
      End Sub
End Class

(*) 不重要。它只是根据需要计算文本大小(以像素为单位的宽度和高度)以纠正表单大小,并且相应的标签获取 Me.Message 属性的值。

(**) 这就是我的意思。您不能创建 MessageBox 类的新实例,您将收到以下错误消息:“Type System.Windows.Forms.MessageBox 没有构造函数。” 好吧,我的类也没有构造函数,但可以声明它的一个实例。这里有什么诀窍?

非常感谢!


解决了。感谢 OneFineDay。

Public Class MessageBoxC

    Private Sub New()
       'Empty
    End Sub

    Public Overloads Shared Function Show(ByVal message As String) As System.Windows.Forms.DialogResult
       Return Show(message, Constants.MyAppName, Constants.messageTitle, MessageBoxCButtons.OK, MessageBoxCIcon.Undefined)
    End Function

    Public Overloads Shared Function Show(ByVal message As String, _
                                          ByVal caption As String, _
                                          ByVal title As String, _
                                          ByVal buttons As Library.MessageBoxCButtons, _
                                          ByVal icon As Library.MessageBoxCIcon) As System.Windows.Forms.DialogResult
       Dim msgBoxC As New CBox(message, caption, title, buttons, icon)
       msgBoxC.ShowDialog()
       Return msgBoxC.DialogResult
    End Function

    Private Class CBox
    Inherits System.Windows.Forms.Form

       Sub New(ByVal message As String, _
               ByVal caption As String, _
               ByVal title As String, _
               ByVal buttons As Library.MessageBoxCButtons, _
               ByVal icon As Library.MessageBoxCIcon)

          MyBase.New()
          InitializeComponent()

          Me.Message = message
          Me.Text = caption
          Me.Title = title
          Me.Buttons = buttons
          Me.Icon64 = icon

          Me.OptimizeMe()
       End Sub
    End Class
End Class

Public Class Form1
   Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
      Dim dialogResult As New DialogResult
      dialogResult = MessageBoxC.Show("This is a simple message.")
      MessageBox.Show(dialogResult.ToString)
   End Sub
End Class

【问题讨论】:

  • P.S.我的 MessageBoxC 类继承 System.Windows.Forms.Form。我知道基类已经有一个构造函数,但是除了“绘制”一个新类之外,如何避免它。
  • Messagebox.Show(包含在框架中)是一种共享(静态)方法,其代码类似于Dim msgbox As New MessageBox : msgbox.Label.Text = "Hello" : msgbox.ShowDialog() : msgbox.Dispose。所以它当然会创建一个新的表单实例——它只是在一个公共的、静态的接口中这样做,所以作为程序员你不需要关心它。

标签: vb.net class constructor instance declare


【解决方案1】:

如果不声明任何构造函数,则会自动创建一个默认构造函数(这是一个没有参数的公共构造函数)。

为防止任何人创建您的类的实例,您可以创建一个私有构造函数,如下所示:

Public Class MessageBoxC

    Private Sub New()
        ' Prevents anyone creating an instance of this class.
    End Sub

End Class

请注意,您的Show 方法需要声明为Shared,否则您将无法调用它。事实上,它必须是 Shared,即使使用您提供的代码也是如此。

【讨论】:

  • 当然,我收到另一条错误消息:与声明新系统 MessageBox 时的错误消息不同(因为我真的很想了解其中的技巧......但这也有效。所以...... .
  • 而且我不能将其声明为共享方法,因为那样我就无法在课堂上使用它(请参阅我的问题:已编辑)
  • 如果您无法创建此类的实例并且不使用Shared 方法,那么您打算如何使用此类,我有点困惑。
  • 他可以创建一个返回正确初始化实例的工厂方法。
【解决方案2】:

这是隐藏构造函数的一种方法 - 主要是因为相关类不可访问。

Public Class Form1

  Private Sub meLoad() Handles Me.Load
    'Usage
    FooBar.Show("Hi")
  End Sub
  '...
End Class

Public Class FooBar

  Private Sub New()
  End Sub

  Public Shared Sub Show(message As String)
    Dim mbc As New MessageBoxC(message)
    mbc.ShowDialog()
  End Sub

  'MessageBoxC is not exposed outside of Foobar which is the entry point
  Private Class MessageBoxC : Inherits Form
    'define cTor's as needed
    Public Sub New(message As String)
      Me.Text = message
    End Sub
    'define content
  End Class
End Class

【讨论】:

  • 对不起,我不能给你的答案加分(它不允许我这样做);我是新手。
  • 您仍然可以检查为答案
  • 我不明白您所说的“check post as answer”是什么意思。对不起 )。该链接只是我的MessageBoxC 外观的屏幕截图(以及它的工作原理)。
  • @LowLevel,答案如何?