繁体   English   中英

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

[英]how to initialize all the base class objects from derived class using base keyword

以下代码通过调用派生类的基类构造函数,使用“ 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


        }
    }

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

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关键字初始化两个基类。

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

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

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

.Net中不允许从多个类继承。 (原因将导致钻石问题 )。 但是允许从多个接口和多级继承实现。

在第一段中,首先调用A的构造函数,然后调用B的构造函数。
在第二个片段中,首先将调用A的构造函数,然后调用B,再调用C的构造函数。

您可以在LINQPad中这样尝试:

在此处输入图片说明

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

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");
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM