什么是" C#方式"将继承的类构造函数的参数传递给基类构造函数?这是否需要覆盖基类中的base_model字符串?
// Base class
class vehicle
{
private string base_model = String.Empty;
vehicle(string model)
{
this.base_model = model;
}
}
// Inherited classes
class tesla : vehicle
{
private readonly string model = "Model S"; // This is unchanging
tesla(string model) : base ( **pass model to base_model** )
{
// Initialize
}
}
class ferrari : vehicle
{
private readonly string model = "458 Spider"; // This is unchanging
ferrari(string model) : base ( **pass model to base_model** )
{
// Initialize
}
}
@JohnLBevan提出了另一个问题:
这让我想到另一个问题:是否可能没有tesla
类(或ferrari
类的构造函数参数)并自动传递model
变量(即"Model S"
到base_model
?
答案 0 :(得分:6)
更符合OO标准的方法是使用抽象属性。这意味着基类具有定义属性,但扩展类必须实现它。这也意味着您无法直接创建vehicle
的实例,而是必须创建一个派生类型。
abstract class vehicle
{
vehicle() { }
public abstract string Model { get; }
}
// Inherited classes
class tesla : vehicle
{
private readonly string model = "Model S"; // This is unchanging
public override string Model { get { return model; }}
}
class ferrari : vehicle
{
public override string Model { get { return "458 Spider"; }}
}
您真正希望将派生构造函数中的值传递给基本构造函数的唯一时间是在基类中主动使用这些值的时间。这通常是在您重写基础构造函数时,或者您正在使用依赖项注入或依赖项解析模式。基类不应该作为派生类的信息聚合。
答案 1 :(得分:3)
你到底完成了什么,只把变量名放在你有星号的地方:
// Inherited classes
class tesla : vehicle
{
private readonly string model = "Model S"; // This is unchanging
tesla(string model) : base ( model )
{
// Initialize
}
}
您还需要确保基类的构造函数对其子类可见(即不是私有的)
// Base class
class vehicle
{
private string base_model = String.Empty;
protected vehicle(string model)
{
this.base_model = model;
}
}