我对Static class,Private构造函数和抽象类
的使用感到困惑防止实例创建。(对备选方案感到困惑)。
适合每个人的最佳方案是什么?
答案 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);
}
}