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

时间:2012-02-28 07:24:59

标签: c# winforms class

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

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

此类没有构造函数

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

由于其保护级别,构造函数无法访问。

7 个答案:

答案 0 :(得分:6)

创建没有构造函数的类的唯一方法是使用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没有构造函数的消息。

答案 1 :(得分:2)

MessageBox上的方法是 static ;你可以使用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() {...}
}

答案 2 :(得分:0)

使其成为没有构造函数的静态类,或将其设为Abstract类。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以将公共STATIC方法添加到您的类中,您可以像在messagebox中一样。 请记住,静态方法无法访问同一类中的非静态属性或方法。

希望它有所帮助。

答案 5 :(得分:0)

考虑使用GOF("Gang Of Four"

中描述的Creational模式

有以下几种方法:

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 method

以下是关于C#-Corner Factory method Design pattern using 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)如果要以这种方式创建一组对象,请使用Abstract factory

以下是有关codeproject的文章摘录:Understanding and implementing abstract factory pattern in 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)用你的常识来开发自己的设计,满足你的需求。

答案 6 :(得分:0)

如果它的目的是不允许用户实例化你可以创建的类的新实例 所有构造者都不那么公开了。

例如 - 受保护。