【问题标题】:Why do we have to pass values from derived class constructor to base class constructor为什么我们必须将值从派生类构造函数传递给基类构造函数
【发布时间】:2018-05-13 06:11:44
【问题描述】:
namespace Sample
{
    public class Program
    {
        static int x;

       public Program(int Y) {  
            x = Y;
           Console.WriteLine("one value base class constructor called");
        }  

        static void Main(string[] args)
        {         
            Program prog = new s(10);           
            Console.ReadKey();
        }
    }

    public class s: Program {

        public s(int k):base(10)
        { 
           Console.WriteLine("derived class constructor called");

        }       
    }
}

为什么要先调用基类构造函数?如果我在基类中定义了参数化构造函数,那么派生类构造函数必须将值从派生类传递给基类构造函数。

我想知道为什么它是强制性的?如果没有值传递给基类构造函数,则编译器会给出错误消息“没有给定的参数对应于所需的形参”。

我不是在问我是否必须将值传递给基类,但我的问题是为什么我必须这样做?为什么要先调用基类构造函数?

【问题讨论】:

标签: c# inheritance constructor


【解决方案1】:

您已经回答了自己的问题:

众所周知,基类构造函数是在派生类构造函数之前调用的。

由于您的基类只有一个必须接受参数的构造函数,因此您必须在调用它时提供此参数。

如果您的基类有一个无参数构造函数,那么编译器会对public s(int k):base() 或什至只是public s(int k) 感到满意(因为base() 将在编译时隐式添加)。

但是,由于您显式为类 Program 编写了构造函数,编译器不提供默认的无参数构造函数,因此 实例化 Program 类的唯一方法是调用它构造函数并传递相关参数。

【讨论】:

  • 优秀的答案。文字优美。非常清晰。
  • 不用担心。我不知道你到底是怎么投反对票的!
猜你喜欢
  • 1970-01-01
  • 2020-11-15
  • 2013-09-14
  • 2014-06-23
  • 2016-07-19
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 2018-07-21
相关资源
最近更新 更多