如何创建一个没有任何构造函数的类,就像MessageBox类一样

本文关键字:就像 构造函数 一样 MessageBox 创建 何创建 一个 任何 | 更新日期: 2023-09-27 18:26:04

如何创建一个没有构造函数的类,就像MessageBox类没有构造函数一样。我不能使这个类成为静态的,因为其中声明了一个公共静态方法,而该方法使这个类的对象成为静态的。在C#3.5 中

我想让这个类和System.Windows.Forms.MessageBox类一样,其中没有构造函数并且当我们创建此类对象时,出现错误:

该类没有构造函数

其中,当对象创建错误时,作为具有私有构造函数的类-

构造函数由于其保护级别而不可访问。

如何创建一个没有任何构造函数的类,就像MessageBox类一样

创建一个没有构造函数的类的唯一方法是使用static class

然而,您似乎希望能够从类本身内部创建该类的实例,这在静态类中是不可能的。为此,您应该为类提供一个私有构造函数:

class Foo
{
    private Foo() { }
    public static Foo Create()
    {
        return new Foo(); // Only members of Foo can directly invoke the constructor.
    }
}

如果同一程序集中Foo之外的方法试图实例化Foo,则给出的消息将是,由于其保护级别,构造函数不可访问。如果您尝试从另一个程序集访问它,它将给出Foo没有构造函数的消息。

MessageBox上的方法是静态;您可以使用static修饰符来完成此操作

public static class Foo {
    public static void Bar() {...}
}

然后:

Foo.Bar();

在早期版本的c#中(在类上允许static之前),您必须作弊:

public class Foo {
    private Foo() {} // hide the constructor
    public static void Bar() {...}
}

使其成为不带构造函数的静态类或抽象类。

创建一个静态类,或者使用私有构造函数创建一个类。

您可以将公共STATIC方法添加到类中,您将获得与messagebox中相同的结果。请记住,静态方法不能访问同一类中的非静态属性或方法。

希望能有所帮助。

考虑创造性模式的使用,如GOF("四人帮")中所述

有以下几种方式:

1) 如果您只想创建一个对象实例,请使用Singleton

MSDN 上有一个线程安全单例的好例子

在该策略中,实例是在该类被引用为

public sealed class Singleton
{
   private static readonly Singleton instance = new Singleton();
   private Singleton(){}
   public static Singleton Instance
   {
      get 
      {
         return instance; 
      }
   }
}

2) 如果您不想指定要创建的确切类,请使用Factory方法

以下是一篇关于C#的文章的摘录-Corner Factory方法使用C#设计模式

abstract class Factory 
    {
        public abstract Product GetProduct(); //Factory Method Declaration
    }
class concreteFactoryforProcuct1 : Factory
    {
        public override Product GetProduct() //Factory Method Implementation
            {
                return new Product1();
            }
    }

3) 如果有一组对象要以这种方式创建,请使用抽象工厂

以下是一篇关于代码项目的文章的摘录:在C#中理解和实现抽象工厂模式

创建抽象工厂

interface IPhoneFactory //'I' stands for interface no relation with Iphone
{
    ISmart GetSmart();
    IDumb GetDumb();
}

创建混凝土工厂

class SamsungFactory : IPhoneFactory
{
    public ISmart GetSmart()
    {
        return new GalaxyS2();
    }
    public IDumb GetDumb()
    {
        return new Primo();
    }
}
...

创建客户端

enum MANUFACTURERS
{
    SAMSUNG,
    HTC,
    NOKIA
}
class PhoneTypeChecker
{
    IPhoneFactory factory;
    ...
    public PhoneTypeChecker(MANUFACTURERS m)
    {
        m_manufacturer= m;
    }
    public void CheckProducts()
    {
        switch (m_manufacturer)
        {
            case MANUFACTURERS.SAMSUNG:
                factory = new SamsungFactory();
                break;
            case MANUFACTURERS.HTC:
                factory = new HTCFactory();
                break;
            case MANUFACTURERS.NOKIA:
                factory = new NokiaFactory();
                break;
        }
        ...
        factory.GetSmart();
        factory.GetDumb();
        ...
    }
}
static void Main(string[] args)
{
    PhoneTypeChecker checker = new PhoneTypeChecker(MANUFACTURERS.SAMSUNG);
    checker.CheckProducts();
    ...
}

4) 利用你的常识来开发你自己的设计,以满足你的需求。

如果它的目的不允许用户,它会实例化您可以创建的类的新实例所有构造函数的可见性都低于公共构造函数。

例如,受保护。

相关文章: