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

Posted

技术标签:

【中文标题】如何使用 base 关键字从派生类初始化所有基类对象【英文标题】:how to initialize all the base class objects from derived class using base keyword 【发布时间】: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 关键字初始化两个基类。

【问题讨论】:

想象所有人,compiling for themselves。 【参考方案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");
    

【讨论】:

以上是关于如何使用 base 关键字从派生类初始化所有基类对象的主要内容,如果未能解决你的问题,请参考以下文章

C# 中base和this关键字

检测基类对指向派生类的引用的分配

使用派生 [C++] 生成的参数初始化基类

基类对派生类指针的引用

访问控制与继承

base(C# 参考)