【问题标题】:how to initialize all the base class objects from derived class using base keyword如何使用 base 关键字从派生类初始化所有基类对象
【发布时间】:2017-07-06 15:40:28
【问题描述】:

以下代码通过从派生类调用基类构造函数,使用“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 关键字初始化两个基类。

【问题讨论】:

标签: c# class inheritance


【解决方案1】:

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

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

【讨论】:

  • 感谢评论。你的意思是我不能从 C 类调用 A 类的构造函数?
  • @RR:正确。一个构造函数只能被调用一次,并且每个类必须初始化它的基类。由于B必须调用A的ctor,C不能也调用它。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    在第一个 sn-p 中,首先调用 A 的构造函数,然后调用 B 的构造函数。
    在第二个 sn-p 中,首先调用 A 的构造函数,然后调用 B 的构造函数,然后调用 C 的构造函数。

    【讨论】:

    • 是的,我没有使用多级继承,而是多级继承。
    【解决方案4】:

    你可以在 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");
        }
    

    【讨论】:

      猜你喜欢
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      相关资源
      最近更新 更多