C# - 静态类,私有构造函数,抽象类 - 都阻止实例创建 - 使用哪一个?

时间:2009-09-05 13:33:36

标签: c#

我对Static class,Private构造函数和抽象类

的使用感到困惑

防止实例创建。(对备选方案感到困惑)。

适合每个人的最佳方案是什么?

4 个答案:

答案 0 :(得分:4)

这取决于您的需求。

  • 静态类可以被认为是“一堆方法” - 你会使用它,如果你只需要对一些方法进行分组,样本用法:MathHelpers,使用Sin,Cos,ConvertXToY等方法(或主机扩展)方法)。

  • 私有构造函数 - 当您希望能够控制对象的创建方式时,您将使用此构造函数,例如,如果您想确保这些对象只能由静态方法创建。一个例子:


class Robot
{
 public string Name { get; }
 private Robot() 
 { 
   // some code
 }

 public static Robot CreateAndInitRobot(string name)
 {
   Robot r = new Robot();
   r.Name = name;
   return r;
 }
}
  • 抽象类 - 当你定义一些抽象对象时应该使用的那些,不应该被初始化,因为它是不完整的/抽象的,你想进一步专门化它(通过继承它)。

答案 1 :(得分:3)

只有静态成员时才使用静态类。当您想要继承该类时,它不适用于任何场景。

私有构造函数确保只有类本身内的代码可以创建它的实例,即现有实例中的静态方法或实例方法。即使你从类继承,它仍然必须调用基类的创建过程,所以没有办法解决它。

抽象类对于防止实例创建毫无用处。你必须继承该类才能将它用于任何事情,你可以将你喜欢的任何构造函数添加到后代类中。

答案 2 :(得分:2)

静态类不能用作继承的基类,只能包含静态成员。

抽象类根本无法实例化,仅作为继承的基类。它们可以提供派生类必须覆盖的抽象成员(没有实现),它们可以提供派生类可能覆盖的虚拟成员(具有默认实现),或者它们可以提供提供通用功能的常规(密封)成员。

私有构造函数(通常位于非抽象的非静态类中)阻止在没有参数/初始化的情况下实例化类。当类在初始化/构造期间需要特定信息处于有效状态时,它们最有用。

答案 3 :(得分:1)

抽象类意味着您必须从类继承才能实例化。它通常用于基本功能很常见的地方,但是派生类中会提供一些不能默认的专门化 - 换句话说,你必须提供自己的行为。

私有构造函数是阻止某人使用 new 实例化类的.NET 2之前的方法 - 在.NET 2中引入了静态构造函数。这将用于您想要某种形式的工厂方法,例如

public static class MyClass
{
  static MyClass() {}
  private static MyClass LoadFromDatabase(int id)
  {
    // Get the data here....
  }
  public static MyClass LoadByKey(int id)
  {
    MyClass c = new MyClass();
    return c.LoadFromDatabase(id);
  }
}