有人可以向我解释为什么结果如下:DVD Unknown DVD:DVD
using System;
class Program
{
class M
{
internal string n;
internal M() { }
internal M(string N)
{
Console.Write(N + " ");
n = N;
}
}
class D : M
{
internal D(string N) : base(N) { n = "DVD:" + N; }
}
static void Main(string[] args)
{
M d1 = new D("DVD");
M m1 = new M("Unknown");
Console.WriteLine(" " + d1.n);
}
}
我理解代码的大部分内容,除了这一行:
internal D(string N) : base(N) { n = "DVD:" + N; }
我知道base会从父类调用某些东西,但在这种情况下我只是不知道它。 :/
答案 0 :(得分:2)
让我们分开这一行:
internal D(string N) : base(N)
{
n = "DVD:" + N;
}
您最需要澄清的部分是base(N)
。 base(N)
是对M(string N)
构造函数的调用。这种情况发生在之前运行此构造函数(n = "DVD...
)的主体。
如果您修改稍微打印的内容,我认为代码会更清晰:
class M
{
internal string n;
internal M() { }
internal M(string N)
{
Console.WriteLine("in base " + N);
n = N;
}
}
class D : M
{
internal D(string N) : base(N) { n = "DVD:" + N; }
}
static void Main(string[] args)
{
M d1 = new D("DVD");
M m1 = new M("Unknown");
Console.WriteLine("d1.n is " + d1.n);
}
输出
in base DVD
in base Unknown
d1.n is DVD:DVD
同样的事情发生在DVD Unknown DVD:DVD
的输出中,只是在一行上:首先,D
的构造函数调用M
的构造函数,写入{{1} (在DVD
添加到它之前发生这种情况)。然后,直接调用DVD:
的构造函数,编写M
。然后,您编写Unknown
的{{1}},即d1
。
答案 1 :(得分:1)
首先,Console.WriteLine("" + d1.n);会给你DVD:DVD,因为基础意味着使用父类'构造函数。因此,当您将参数发送到D类时,它会将您的代码发送到您的M类,它正在执行它,它会为您提供" DVD"在你的屏幕上,然后它正在改变n的值。之后你发送" Unknown"直接重视你的M级课程,这与你的D课程无关,它会向你显示" Unknown"在你的屏幕上。最后你要求D级' n值已经是" DVD"。结果是DVD Unknown DVD:DVD。我希望这对你有意义。