构造函数参数和继承

Fra*_*ank 22 c# inheritance constructor

OOP的新手,我很困惑派生类构造函数在继承C#中的基类时的工作方式.

首先是基类:

class BaseClass
{
    private string BaseOutput = null;

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

    public virtual void PrintLine()
    {
        Console.WriteLine(BaseOutput);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是派生类:

class SubClass : BaseClass
{
    private string SubOutput = null;

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

    public override void PrintLine()
    {
        Console.WriteLine(SubOutput);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,该计划的主要部分:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有得到的是为什么,在调用派生类的构造函数时,我还必须传递基类所需的参数.如果没有为其分配值,派生类中的BaseOutput字段是否应该保持为null?为什么不能这样的工作:

public SubClass(string SubString) : base(BaseString)
Run Code Online (Sandbox Code Playgroud)

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

public SubClass(string AnotherString, string SubString) : base(BaseString)
Run Code Online (Sandbox Code Playgroud)

最后,当你以正确的方式做到这一点并输入这个......

public SubClass(string BaseString, string SubString) : base(BaseString)
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*rvy 24

至于为什么你做不到:

public SubClass(string SubString) : base(BaseString)
Run Code Online (Sandbox Code Playgroud)

BaseString是什么?

你可以这样做:

public SubClass(string SubString) : base("SomeFixedString")
Run Code Online (Sandbox Code Playgroud)

要么

public SubClass(string SubString) : base(SubString)
Run Code Online (Sandbox Code Playgroud)

但是如果要将一个字符串传递给基类构造函数的参数并且还有一个字符串,则需要接受两个参数.

至于保持同名,你没有.你可以这样做:

public SubClass(string AnotherString, string SubString) : base(AnotherString)
Run Code Online (Sandbox Code Playgroud)

至于最后一个问题,第一个参数没有做任何事情,它被传递给基类构造函数.如果你愿意,你可以用它来做别的事.


ose*_*ose 5

如果要为派生类提供不设置BaseString的机会,则需要在基类中提供一个默认构造函数,如下所示:

public BaseClass()
{

}
Run Code Online (Sandbox Code Playgroud)

现在,在派生类中,您可以像下面这样在基类中不带参数的情况下调用构造函数:

public SubClass(string AnotherString)
     : base()
{
    // base() => explicit call to default construct in the base class.
    // Do something else
}
Run Code Online (Sandbox Code Playgroud)

这提供了良好的软件工程实践:如果要提供不设置基类字符串的机会,请在基类中进行设置。其他“ hacks”(例如,将null作为参数传递给基本构造函数)仅以不应该从子类完成的方式来修改基本类的内部。