如何使用base关键字从派生类初始化所有基类对象

时间:2017-07-06 15:40:29

标签: c# class inheritance

以下代码使用' base'从派生类初始化基类。通过从派生类调用基类构造函数来实现关键字。

    class A
    {

        public int a;
        public int b;
        public A(int x, int y)
        {
            a = x;
            b = y;
        }
    }
    class B : A
    {
        int c;
        public B(int s, int n,int z)
            : base(s, n)
        {
            c = z;
        }
        public int add()
        {
            return a + b+c;
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            B b = new B(2, 3,5);
            Console.WriteLine(b.add());//the output is 10 OK


        }
    }

问题

如果派生类继承自多个基类,会发生什么。然后如何使用base关键字从派生类初始化所有基类(如何调用基类构造函数)。**

class A
    {

        public int a;
        public int b;
        public A(int x, int y)
        {
            a = x;
            b = y;
        }
    }
    class B:A
    {

        public int d;
        public int e;
        public B(int x, int y)
        {
            d = x;
            e = y;
        }
    }
    class C:B
    {


    }

然后从C类开始如何使用base关键字初始化两个基类。

4 个答案:

答案 0 :(得分:1)

一个类只能从一个基类继承。

如果你的基类继承自其他一些基类,你的基类将初始化它的基类,就像任何其他类一样。

答案 1 :(得分:1)

正如其他人所说,在.Net中,您只能从一个类继承,但是您可以实现大量接口。差异以及如何实现类似于从多个类继承的效果超出了这个问题的范围。

在您的示例中(使用以前的代码示例作为标准),您必须执行以下操作

class A
{

    public int a;
    public int b;
    public A(int x, int y)
    {
        a = x;
        b = y;
    }
}
class B:A
{

    public int d;
    public int e;
    public B(int x, int y): base (x, y)
    {
        d = x;
        e = y;
    }
}
class C:B
{
    public C(int m, int n) : base(m, n)

}

这实际上会实例化C,然后调用B的构造函数,然后调用B的构造函数。

答案 2 :(得分:0)

.Net中不允许从多个类继承。 (因为这将导致Diamond problem)。但允许从多个接口和多级继承实现。

在第一个片段中,首先调用A的构造函数,然后调用B' s构造函数。
在第二个片段中,首先会调用A的构造函数,然后是B&C,然后是C&#39的构造函数。

答案 3 :(得分:0)

您可以在LINQPad中尝试这样做:

enter image description here

下面的可复制代码(注意,只有在LinqPad中有效'由于}在奇数位置 - linqpad的要求)

parent_page.specific_class