如果基类没有构造函数,我可以从类继承吗?

时间:2019-09-23 09:15:52

标签: c# inheritance

所以我有一个Vehicle类,没有构造函数。我想创建一个名为VehicleExtended的新类,它继承自Vehicle的。 错误是:

  

“车辆”不包含带有0个参数的构造函数(CS1729)

是否可以在没有构造函数的情况下进行继承?

注意:我无法编辑基类,因为它只是我可以看到的元数据。

public class VehicleData : Vehicle
{
    [BsonId]public int _id { get; private set;}
    public bool IsCompany { get; private set;}
    public int OwnerID { get; private set; }
    public string modelName { get; private set;}
}

3 个答案:

答案 0 :(得分:1)

从错误消息中我们可以看到,基类Vehicle 没有构造函数没有参数

  public class Vehicle { 
    ...
    // every Vehicle constructors want some parameters, e.g. id and ownerId
    public Vehicle(int id, int ownerId) {...}
    ...
  }

那是编译器不知道如何创建VehicleData的实例:

  // Since VehicleData is inherited from Vehicle, 
  // Vehicle cosntructor should be executed.
  // What arguments should be passed to it?   
  var test = new VehicleData();

您必须手动实现VehicleData构造函数 ,其中应指定参数:

  public class VehicleData : Vehicle 
  {
    // When creating an instace, use -1 and -1 when calling base constructor
    public VehicleData() : base(-1, -1) {}

    ...
  }

现在上面的代码是 legal

  // We don't want parameters when creating VehicleData instance
  // When creating base class (Vehicle) -1 and -1 are used  
  var test = new VehicleData();

编辑:如果基类Vehicle没有任何public或{{1 }}构造函数(但有protected个构造函数),您不能从private创建基础Vehicle实例,因此不能从VehicleData继承。 Vehicle构造函数只是一个古老的 C ++ 技巧;如果是 C#,为了防止继承,我们应该使用private

答案 1 :(得分:0)

基类有可能具有无法访问的 private 构造函数。在这种情况下,您不能继承该类。

答案 2 :(得分:0)

基于错误消息,我认为类VehicleData具有私有零参数构造函数。 在这种情况下,您不能从VehicleData继承。 例如

public class A
{
    private A() {}
}
public class B : A
{
}

这将无法编译。 但是,如果有一个公共的或受非Zeor参数列表保护的列表,则可以从该类继承:

public class A
{
    private A() {}
    public A(int i) {}
}
public class B : A
{
    public B() : base(0) {}
}

此外,如果事实证明Vehicle仅具有private构造函数,并且您只想添加特定的behaivor,而不要添加任何无法从{中定义的属性中计算得出的属性{1}},而不是继承,您可以使用extesnions-methodes。

Vehicle
相关问题