编码实践 - 使用抽象或私有构造函数

时间:2012-09-17 12:02:41

标签: c# access-modifiers

我对编码习惯有疑问。我想创建一个无法初始化的类。我相信我有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
    }
}

8 个答案:

答案 0 :(得分:4)

  

我想创建一个无法初始化的类。

留下了可能的用法:静态或基类。

如果您的课程将来自,请使用abstract。在这种情况下,私有/受保护的构造函数将是一个黑客。

您的示例代码看起来更像是static类。以Singleton为替代品。

答案 1 :(得分:3)

良好做法:私有构造函数(例如,至少是GOF书籍在使用Factory模式时推荐的内容)。我建议你使用抽象,如果它是一个基类(这就是它的名字所暗示的)。

答案 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模式相同

Info

Coding

私有构造函数似乎是满足您需求的好方法。摘要也很好,但私有构造函数比抽象方便。但是如果你想扩展它的信息,那么使用抽象可能是个好主意。

答案 7 :(得分:1)

如果类需要“启动”,则需要初始化(除非你要使用的是静态方法)。
抽象类用于将一些(或全部)实现留给子类,并根据您的描述 - 不适合您 “静态课程” - 我猜这里没有特别的好处(在你的情况下) 私有构造函数 - 用于限制谁可以实例化该类 不确定这些是否与你的设计相符,但我想你真的想要一个单身 - 查一查,这是最常见和最基本的设计模式。
顺便说一句 - 我只使用单身作为最后的手段,通常当班级控制某种非共享资源时。