所以我有一个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;}
}
答案 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