参数与格式参数不对应;遗产

时间:2017-11-02 08:01:06

标签: c# inheritance

我正在学习C#,并且一直在练习继承的变种。其他人已经工作了,但是这个引发了一个错误,指出一个参数与形式参数不对应。这个问题只发生在我添加派生类时,我花了一个小时试图修复无济于事。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace SoloLearn
{
    class Program
    {
      public class Parent
      {
          public string fName, lName;
          public int employeeId;
          public Parent(string fName, string lName, int employeeId)
          {
              this.fName = fName;
              this.lName = lName;
              this.employeeId = employeeId;
          }
          public decimal Money(decimal d)
          {
              return d;
          }          
      }
      public class Child : Parent
      {

      }

        static void Main(string[] args)
        {

            Parent p1 = new Parent("Ted", "Baxter", 5432);

            Console.WriteLine("{0} {1} {2}", p1.fName, p1.lName, p1.employeeId);

            Console.WriteLine((p1.Money(5.50m)));
        Child c1 = new Child();
        Console.WriteLine(c1.fName);

        }
    }
}

2 个答案:

答案 0 :(得分:1)

每个构造函数都通过显式代码调用它的基类构造函数:

public ctor(int parameter) : base(parameter)

或隐含地:

public ctor(int parameter) {}

这实际上将编译为:

public ctor(int parameter) : base()

请注意,如果您没有明确说明要从基类执行的重载,则默认情况下将选择无参数构造函数,即使您的子构造函数具有与父类之一完全相同的签名&# 39; s构造函数。

Child课程中,您没有指定构造函数,因此c#编译器会为您提供默认构造函数。 (注意 - 静态类不能有构造函数,只能有静态构造函数。请参阅Jeppe Stig Nielsen的评论。)

默认构造函数是一个无参数构造函数,它在类的实例中初始化没有值,当然,也会调用base-parameter-less构造函数。 由于您的基类没有无参数构造函数,因此会出现编译错误。

答案 1 :(得分:0)

其中一个基类'构造函数必须由子类调用。当你有一个无参数构造函数时,编译器会为你处理这个问题,但在你的情况下你不会这样做:

public Parent(string fName, string lName, int employeeId)

您可以重写子类以将参数传递给基类:

public class Child : Parent
{
    public Child(string fName, string lName, int employeeId) : base(fName, lName, employeeId)
    {

    }
}

或者你可以创建一个无参数构造函数并将虚拟值放在:

public class Child : Parent
{
    public Child() : base(string.Empty, string.Empty, -1)
    {

    }
}

或两者兼而有之。

请注意,基类' 构造函数将始终在子类'之前调用。构造