【问题标题】:C#: How to use a derived class's const variable in base's constructorC#:如何在基类的构造函数中使用派生类的 const 变量
【发布时间】:2011-05-24 01:30:45
【问题描述】:

提前致谢,

我的情况是我有一个名为 Vehicle 的抽象类,它包含:

private List<Tire> m_Tires;

问题是列表中的轮胎数量是在派生类中确定的,并且在一个和另一个之间有所不同,但是实例化所需的代码是相同的,因此我非常希望避免代码重复并将其放置抽象 Vehicle 类的构造函数中的代码(实例化 m_Tires)。

我首先想到使用protected abstract void initializeTires();在派生类中实现,并从Vehicle的构造函数中调用。我在这里看到它的编程很糟糕而且容易出错。

长话短说:是否有可能避免这里的代码重复,或者我只需要和它和平相处?

【问题讨论】:

  • 您可以将轮胎数量作为参数传递给基类。

标签: c# constructor virtual instantiation derived-class


【解决方案1】:

您可以创建一个protected 构造函数并将其链接起来。

【讨论】:

  • 感谢您的超级快速响应。我不知道我是怎么错过的。你解决了我的问题。
【解决方案2】:

如何创建一个:

initializeTires(int numberOfTyres); 

在基类中并在派生类中使用正确的参数调用它。

【讨论】:

    【解决方案3】:

    @Oded 就是一个例子

    public abstract class MyAbstract {
       private List<Tire> m_Tires;
    
       protected MyAbstract(int count) {
          m_Tires = new List<Tire>(count);
       }
    }
    
    public class MyClass : MyAbstract {
       public MyClass(int count) : base(count) { }   
    }
    

    【讨论】:

    • 实际上更适合我的情况是: public abstract class Vehicle { private List m_Tires; protected Vehicle(int i_NumOfTires) { m_Tires = new List(i_NumOfTires); } } 公共类 Car : Vehicle { private const int k_NumOfTires = 4 public Car() : base(k_NumOfTires) { } }
    • 是的,我对相互冲突的信息感到有些困惑......你提到你需要根据一个数字进行初始化,但你的示例 init-method 没有接受任何参数 :)
    • 我知道你在哪里弄糊涂了,我的意图是 initializeTires 将直接引用 const 变量。我写的时候似乎很清楚,但我发现它可能有点混乱。
    • 请问用一定长度初始化列表的目的是什么?如果它应该是固定大小,那么请改用数组,因为即使轮胎数量超过初始长度,您仍然可以继续添加到列表中。
    猜你喜欢
    • 2011-04-23
    • 2018-06-26
    • 2015-08-18
    • 2020-11-28
    • 2012-12-24
    • 2018-07-16
    • 2021-11-11
    • 2016-07-19
    相关资源
    最近更新 更多