Bif*_*iff 0 c# inheritance constructor
将继承的类构造函数的参数传递给基类构造函数的"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
}
}
Run Code Online (Sandbox Code Playgroud)
@JohnLBevan提出了另一个问题:
这让人想起另一个问题:是否有可能没有tesla
类(或ferrari
类的那个)的构造函数参数,并自动将model
变量(即"Model S"
)传递给base_model
?
更符合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"; }}
}
Run Code Online (Sandbox Code Playgroud)
您真正希望将值从派生构造函数传递到基本构造函数的唯一时间是在基类中主动使用这些值的时间.这通常是在您重写基础构造函数时,或者您正在使用依赖项注入或依赖项解析模式.基类不应该充当派生类的信息聚合.