为什么我不能在拥有私有构造函数的情况下调用默认构造函数

本文关键字:构造函数 情况下 调用 默认 不能 拥有 为什么 | 更新日期: 2023-09-27 18:30:01

我有一个带有私有重载构造函数的类

 class Car
    {
        string _Make;
        string _Model;
        Car(string make, string model)
        {
            _Make = make;
            _Model = model;
        }
    }

然后我尝试调用上面类的默认构造函数

class Daytona
{
    public int Foo()
    {
        Car c = new Car(); //COMPILATION ERROR
        return 0;
    }
}

请注意,两个类都在同一个命名空间中!

我无法使用默认构造函数创建Car的实例。但是无论我是否创建默认构造函数,我都应该能够访问默认构造函数。但是我为什么会出现这个错误?

好吧,伙计们,VS 2010发生了一些不好的事情,当我重新启动我的机器时,VS 2010编译了上面的代码。所以这个问题得到了解决

当我重新编译它时,我的编译器再次带来了错误,在" Car c = new Car();"行中,错误为MyNamespace.Car.Car(string,string)由于其保护级别而无法访问

但我想把这个顶部拖到一个新的区域,为什么有人想创建一个私人构造函数?(以上代码仅用于测试!)

为什么我不能在拥有私有构造函数的情况下调用默认构造函数

public class Car
    {
        string _Make;
        string _Model;
        public Car(){}    
        public Car(string make, string model)
        {
            _Make = make;
            _Model = model;
        }
    }

将其公开,但如果您想在没有参数的情况下调用它,还需要添加一个无参数构造函数。如果您定义了另一个构造函数(带参数)

,则不再隐式定义默认构造函数

您没有class Car公共构造函数,该构造函数不需要传递参数。因此,您需要添加此构造函数。当您已经定义了另一个构造函数时,必须显式定义此构造函数。我还将public添加到您已经拥有的构造函数中。

public class Car
{
    string _Make;
    string _Model;
    public Car()
    {
        // Default constructor - does not require arguments
    }
    public Car(string make, string model)
    {
        _Make = make;
        _Model = model;
    }
}

如果您愿意,第二个构造函数仍然可以是私有的,但不能直接调用它。

现在你可以做任何一件事:

Car A = new Car(); // Creates a new instance, does not set anything
Car B = new Car("MyMake", "MyModel"); // Creates a new instance, sets make and model

为什么是私有或受保护(对于子类)构造函数?工厂是完美的例子,如果你想为一个可能有复杂设置等的类提供易于使用的创建工厂,那么拥有一个私有构造函数将阻止某人在没有提供足够值的情况下创建实例:

示例:

public class Car
{
   public static Car CreateNew()
   {
      Car c = new Car();
      c.Engine = Engine.CreateNew(4);  // 4 cyl
      //set properties so that the object will behave correctly...
      return c;
   }
   public static Car CreateNew(string make, string model, Engine e)
   {
     Car c = new Car(make,model);
     c.Engine = e;
   }
   private Car(){
   }
   private Car( string make, string model) : this() {
      Make = make;
      Model = model;
   }
   public string Make { get; set; }
   public string Model {get; set; }
   public Engine {get; private set; }
   //other properties that maybe are not so simple or understood
   //or properties that need to be set to control other behaviors..
}

现在我已经创建了创建Car的工厂,这些工厂方法是创建类实例的唯一方法。