在继承上下文中使用base

时间:2014-05-16 14:50:46

标签: c# inheritance

有人可以向我解释为什么结果如下: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会从父类调用某些东西,但在这种情况下我只是不知道它。 :/

2 个答案:

答案 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。我希望这对你有意义。