2

我有一个关于编码练习的问题。我想创建一个无法初始化的类。我相信我有 3 个选择:

  • 抽象修饰符
  • 静态修饰符
  • 私有构造函数

我不想仅仅因为必须将我所有的属性和方法命名为“静态”而创建一个静态类——它看起来很乱(而且我不能使用“this”关键字)。

根据 MSDN:

在类声明中使用 abstract 修饰符来指示一个类仅作为其他类的基类。

编辑没有任何东西会从这个类继承。

但是,这将是一个解决方案(但在这种情况下使用它对我来说似乎是错误的)。

或者,我可以创建一个私有构造函数,这样类就不能被初始化。

如果有帮助,原因是:该类负责启动工作流程。它不需要初始化,因为没有返回任何内容 - 它只需要“启动”。

演示代码

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
    }
}
4

8 回答 8

4

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

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

如果您的类将派生自,请使用abstract. 在这种情况下,私有/受保护的构造函数将是一种黑客攻击。

您的示例代码看起来更像一个static类。以 Singleton 作为替代方案。

于 2012-09-17T12:04:40.647 回答
3

良好实践:私有构造函数(例如,在使用工厂模式时,至少是GOF书中推荐的)。如果它是一个基类,我会建议你使用 abstract (这就是它的名字所暗示的)。

于 2012-09-17T12:04:57.983 回答
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);
    } 
}
于 2012-09-17T12:08:36.943 回答
2

如果该类被严格用作基类,那么它必须abstract适合我。

根据您的更新,我会选择静态类和方法,例如

WorkFlow.Begin(co);

但是,由于您不想这样做,我认为它只会给您留下一个选择......私有构造函数。

于 2012-09-17T12:04:22.130 回答
2

好像你需要一个单身人士。

更多参考:

http://msdn.microsoft.com/en-us/library/ff650849.aspx

如果您不喜欢这个想法,那么抽象类将最适合,因为正如您所说,您不想实例化它,并且不要忘记抽象类就是这样做的,那么为什么要尝试使用私有构造函数。

于 2012-09-17T12:05:29.523 回答
1

我不想仅仅因为必须将我所有的属性和方法命名为“静态”而创建一个静态类——它看起来很乱(而且我不能使用“this”关键字)。

好吧,无论是创建 ctorprivate还是创建类static,调用者访问类的方法和属性(如果调用者不是派生类)的唯一方法是通过public static成员。

private ctor继承链中为您提供了更大的灵活性,但在“避免静态成员”场景中没有多大帮助。

于 2012-09-17T12:08:55.713 回答
1

我会更喜欢私有构造函数,即它与单例模式相同

信息

编码

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

于 2012-09-17T12:09:07.760 回答
1

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

于 2012-09-17T12:14:11.017 回答