将继承的类构造函数参数传递给基构造函数参数

本文关键字:构造函数 参数 参数传递 继承 | 更新日期: 2023-09-27 18:12:38

将继承类构造函数的参数传递给基类构造函数的"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 ?

将继承的类构造函数参数传递给基构造函数参数

更符合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"; }}
}

真正需要将值从派生构造函数传递给基构造函数的唯一情况是当这些值在基类中被积极使用时。当您覆盖了基构造函数,或者正在使用依赖注入或依赖项解析模式时,通常会出现这种情况。基类不应该作为来自派生类的信息的聚合。

就是你所做的,只是把变量名放在你有星号的地方:

// 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;
    }
}