我正在学习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);
}
}
}
答案 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)
{
}
}
或两者兼而有之。
请注意,基类' 构造函数将始终在子类'之前调用。构造