【问题标题】:Pass Inherited Class Constructor Arguments to Base Constructor Arguments将继承的类构造函数参数传递给基构造函数参数
【发布时间】:2014-07-12 02:08:33
【问题描述】:

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

【问题讨论】:

  • IMO 实际模型实例名称不属于基础。它属于实例。
  • @MitchWheat 你能提供一些代码作为例子吗?不知道如何应用。
  • 我支持comment from Mitch - 你所做的很糟糕 - 基类不应该知道任何关于扩展(派生)类的信息。

标签: c# inheritance constructor


【解决方案1】:

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

}

您真正想要将值从派生构造函数传递给基构造函数的唯一时间是当这些值在基类中被积极使用时。这通常是在您覆盖了基本构造函数,或者您正在使用依赖注入或依赖解析模式时。基类不应充当派生类信息的聚合。

【讨论】:

  • 太棒了,这就是我一直在寻找的“C# 方式”,尤其是在 OOP 方面。我也很感谢您对派生构造函数何时适用于基构造函数的解释。
【解决方案2】:

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

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

【讨论】:

  • 这让人想起另一个问题:tesla 类(或ferrari 类)是否有可能没有构造函数参数并自动传递model 变量(即"Model S") 到base_model?
  • 是的;为了将构造函数的参数与私有只读字段区分开来,您将 model 传递给前者,将 this.model 传递给后者。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 2014-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
相关资源
最近更新 更多