我对编码习惯有疑问。我想创建一个无法初始化的类。我相信我有3个选择:
我不想创建静态类只是因为必须将我的所有属性和方法命名为“static” - 它看起来很混乱(我不能使用'this'关键字)。
根据MSDN:
在类声明中使用abstract修饰符来表示a class只是作为其他类的基类。
编辑此类不会继承任何内容。
然而,这将是一个解决方案(但在这种情况下使用它似乎是错误的)。
或者,我可以创建一个私有构造函数,因此无法初始化类。
如果它有助于解释原因:该类负责启动工作流程。它不需要初始化,因为没有返回 - 它只需要'开始'。
演示代码
class Program
{
static void Main(string[] args)
{
WorkFlow wf = new WorkFlow(); // this will error which is fine!
ComplexObject co = new ComplexObject();
WorkFlow.Begin(co);
Console.ReadKey();
}
}
public class WorkFlow
{
private WorkFlow()
{
//private to prevent initialization but this feels wrong!
}
public static void Begin(ComplexObject co)
{
//code to begin the workflow
}
}
答案 0 :(得分:4)
我想创建一个无法初始化的类。
留下了可能的用法:静态或基类。
如果您的课程将来自,请使用abstract
。在这种情况下,私有/受保护的构造函数将是一个黑客。
您的示例代码看起来更像是static
类。以Singleton为替代品。
答案 1 :(得分:3)
答案 2 :(得分:3)
如何使用您的Begin方法作为工厂来创建工作流程。
var workflow = Workflow.Begin(complexObject);
public class WorkFlow
{
private WorkFlow()
{
//private to prevent initialization but this feels wrong!
}
public static WorkFlow Begin(ComplexObject co)
{
return new Workflow(co);
}
}
答案 3 :(得分:2)
如果该类严格用作基类,则对我来说必须是abstract
。
根据您的更新,我会选择静态类&方法,例如
WorkFlow.Begin(co);
但是,既然你不想这样做,我认为只留下一个选项...私有构造函数。
答案 4 :(得分:2)
好像你需要一个单身人士。
更多参考资料:
http://msdn.microsoft.com/en-us/library/ff650849.aspx
如果您不喜欢ideea,那么抽象类最适合,因为正如您所说,您不想实例化它,并且不要忘记抽象类就是这样,所以为什么尝试使用私有构造函数。
答案 5 :(得分:1)
我不想因为必须命名而创建静态类 我所有的属性和方法'静态' - 它看起来很乱(我 不能使用'this'关键字)。
好吧,无论是你创建ctor private
还是创建一个类static
,调用者访问你的类的方法和属性的唯一方法(如果调用者不是派生的)是通过{{1成员。
让public static
为继承链提供更多灵活性,但对“避免静态成员”方案没有多大帮助。
答案 6 :(得分:1)
我更喜欢私有构造函数,即它与Singleton模式相同
私有构造函数似乎是满足您需求的好方法。摘要也很好,但私有构造函数比抽象方便。但是如果你想扩展它的信息,那么使用抽象可能是个好主意。
答案 7 :(得分:1)
如果类需要“启动”,则需要初始化(除非你要使用的是静态方法)。
抽象类用于将一些(或全部)实现留给子类,并根据您的描述 - 不适合您
“静态课程” - 我猜这里没有特别的好处(在你的情况下)
私有构造函数 - 用于限制谁可以实例化该类
不确定这些是否与你的设计相符,但我想你真的想要一个单身 - 查一查,这是最常见和最基本的设计模式。
顺便说一句 - 我只使用单身作为最后的手段,通常当班级控制某种非共享资源时。