为什么我在拥有私有构造函数时无法调用默认构造函数?

时间:2014-11-12 02:04:31

标签: c#

我有以下类与私有重载的构造函数

 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(字符串,字符串)由于其保护级别而无法访问

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

3 个答案:

答案 0 :(得分:8)

public class Car
    {
        string _Make;
        string _Model;

        public Car(){}    

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

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

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

答案 1 :(得分:5)

您没有class Car public 构造函数,不需要传递参数。因此,您需要添加此构造函数。当您已经定义了另一个构造函数时,必须显式定义此构造函数。我还将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

答案 2 :(得分:2)

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

示例:

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,这些工厂方法是创建类实例的唯一方法。