OOP的新增功能,当从C#中的基类继承时,派生类构造函数如何工作使我感到困惑。

首先是基类:

class BaseClass
{
    private string BaseOutput = null;

    public BaseClass(string BaseString)
    {
        BaseOutput = BaseString;
    }

    public virtual void PrintLine()
    {
        Console.WriteLine(BaseOutput);
    }
}

这是派生类:
class SubClass : BaseClass
{
    private string SubOutput = null;

    public SubClass(string BaseString, string SubString) : base(BaseString)
    {
        SubOutput = SubString;
    }

    public override void PrintLine()
    {
        Console.WriteLine(SubOutput);
    }
}

最后,该程序的主要部分:
class Program
{
    static void Main(string[] args)
    {
        BaseClass theBase = new BaseClass("Text for BaseClass");
        SubClass theSub = new SubClass("2nd param", "Text for SubClass");

        theBase.PrintLine();
        theSub.PrintLine();

        Console.ReadKey();
    }
}

我不明白的是为什么,当为派生类调用构造函数时,我还必须传递基类所需的参数。如果没有为其分配任何值,派生类中的BaseOutput字段是否应该保持设置为null?为什么这样的东西不能工作:
public SubClass(string SubString) : base(BaseString)

此外,在此派生类中调用构造函数时,第一个参数的名称必须与基类中的名称相同,否则会引发错误。如果我要在派生类中定义一个名为AnotherString的新字符串变量,为什么这样做不起作用:
public SubClass(string AnotherString, string SubString) : base(BaseString)

最后,当您正确执行此操作并输入时...
public SubClass(string BaseString, string SubString) : base(BaseString)

...子类构造函数中的第一个参数是做什么用的?我的派生类没有在任何方法中分配或使用它。为什么我什至必须把它放在那里?

最佳答案

至于为什么不能做:

public SubClass(string SubString) : base(BaseString)
BaseString是什么?

您可以这样做:
public SubClass(string SubString) : base("SomeFixedString")

或者
public SubClass(string SubString) : base(SubString)

但是,如果您想将一个字符串传递给基类构造函数的参数并添加一个字符串,则需要接受两个参数。

至于保持相同的名称,您不需要。您可以这样做:
public SubClass(string AnotherString, string SubString) : base(AnotherString)

至于最后一个问题,第一个参数什么也不做,而是传递给基类构造函数。如果需要,可以将其用于其他用途。

10-07 19:47
查看更多