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

时间:2014-07-12 02:08:34

标签: 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
    }

}

修改

@JohnLBevan提出了另一个问题:

这让我想到另一个问题:是否可能没有tesla类(或ferrari类的构造函数参数)并自动传递model变量(即"Model S"base_model

2 个答案:

答案 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;
    }
}