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

C# 如何使用base关键字从派生类初始化所有基类对象,c#,class,inheritance,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

下面的代码通过从派生类调用基类构造函数,使用“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关键字初始化派生类中的所有基类(如何调用基类构造函数)**


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

在.Net中不允许从多个类继承。(因为那会导致)。但允许从多接口和多级继承实现

在第一个代码段中,首先调用A的构造函数,然后调用B的构造函数。

在第二个代码段中,首先调用A的构造函数,然后调用B的构造函数,然后调用C的构造函数。

在.Net中不允许从多个类继承。(因为那会导致)。但允许从多接口和多级继承实现

在第一个代码段中,首先调用A的构造函数,然后调用B的构造函数。

在第二个代码段中,首先调用A的构造函数,然后调用B的构造函数,然后调用C的构造函数。

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


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

一个类只能继承自一个基类


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

正如其他人所说,在.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的构造函数,然后调用A的构造函数。

正如其他人所说,在.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的构造函数,然后调用A的构造函数。

您可以在LINQPad中这样尝试:

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


您可以在LINQPad中这样尝试:

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


想象所有的人,。想象所有的人,。是的,我没有使用多重而是多级继承。是的,我没有使用多重而是多级继承。谢谢你的评论。你的意思是我不能从类C调用类A的构造函数?@RR:正确。构造函数只能调用一次,每个类都必须初始化其基类。由于
B
必须调用
A
的构造函数,
C
也不能调用它。谢谢你的评论。你的意思是我不能从C类调用A类的构造函数?@RR:正确。构造函数只能调用一次,每个类都必须初始化其基类。由于
B
必须调用
A
的ctor,
C
也不能调用它。
var test = new C(1, 2);
}

class A
{

    public int a;
    public int b;
    public A(int x, int y)
    {
        a = x;
        b = y;

        Console.WriteLine("A");
    }
}

class B : A
{

    public int d;
    public int e;
    public B(int x, int y) : base(x, y)
    {
        d = x;
        e = y;
        Console.WriteLine("B");
    }
}

class C : B
{

    public C(int x, int y) : base(x, y)
    {
        Console.WriteLine("C");
    }