如何创建一个零构造函数的类,就像没有构造函数的MessageBox类一样。 我不能使这个类静态,因为在它中声明了一个公共静态方法,并且该方法使该类成为对象。 在C#3.5
我想让这个类就像System.Windows.Forms.MessageBox类一样, 其中没有构造函数和 当我们创建此类的对象时出现错误:
此类没有构造函数
当对象创建错误时,作为具有私有构造函数的类 -
由于其保护级别,构造函数无法访问。
答案 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
上有一个关于线程安全单例的好例子在此策略中,实例是第一次创建的任何成员 该类被引用
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)
如果它的目的是不允许用户实例化你可以创建的类的新实例 所有构造者都不那么公开了。
例如 - 受保护。