C# 继承:基类和派生类中的构造函数

C# 继承:基类和派生类中的构造函数,c#,oop,constructor,C#,Oop,Constructor,如果必须将构造函数放入派生类中,为什么需要基类中不包含任何参数的构造函数 public class profile { int experience; string qualification; string skills; public profile(int exp, string qual, string skill) { experience = exp; qualification = qual;

如果必须将构造函数放入派生类中,为什么需要基类中不包含任何参数的构造函数

public class profile 
{
    int experience;
    string qualification;
    string skills;

    public profile(int exp, string qual, string skill)
    {
        experience = exp;
        qualification = qual;
        skills = skill;
    }

    public void DisplayProfile() 
    {
        Console.WriteLine(experience);
        Console.WriteLine(qualification);
        Console.WriteLine(skills);
    }
}

public class resume:profile
{
    string Firstname;
    string Lastname;
    string description;
    string volunteer;
    string achievements;

    public resume(string fname, string lanme, string des, string vol, string ach)
    {
        Firstname = fname;
        Lastname = lanme;
        description = des;
        volunteer = vol;
        achievements = ach;
    }

    public void DisplayResume() 
    {
        Console.WriteLine(Firstname);
        Console.WriteLine(Lastname);
        Console.WriteLine(description);
        Console.WriteLine(volunteer);
        Console.WriteLine(achievements);
    }
}
这是我的代码,现在我在resume构造函数中发现一个错误,即配置文件不包含接受0个参数的构造函数

如果我在基类中通过创建一个不包含0个参数的额外构造函数来重载构造函数,则会删除此错误


现在我不明白为什么会这样。

我不确定我是否理解你的问题。但鉴于下面的代码,没有必要,也没有编译时错误:

public class BaseClass
{
   //No constructor is OK
}

public class DeriveClass : BaseClass
{
   //No constructor is OK
}

class Program
{
    static void Main(string[] args)
    {
        DeriveClass dc = new DeriveClass(); 
    }
}

您试图实现的是什么?

OP是正确的,编译器对此表示不满。如果必须有一个带参数的构造函数,那么必须在所有子类中创建一个带参数的构造函数。此外,还必须显式调用父级的构造函数

你的
简历的构建者应该是:

public resume(string fname, string lanme, string des, string vol, string ach,int exp, string qual, string skill) : base(exp, qual, skill)
{
    Firstname = fname;
    Lastname = lanme;
    description = des;
    volunteer = vol;
    achievements = ach;
}

请参阅修改的参数列表和调用base()的方法。

您需要了解继承的概念

这里有一个例子

class BaseClass
{
  public BaseClass(){Console.WriteLine("This is Base Class")} // This is Base Class constructor (parameterless)
}

class DerivedClass:BaseClass{

 public DerivedClass(){Console.WriteLine("This is Derived Class")} // This is Derived Class constructor (parameterless)

}
现在,在控制台主程序中创建DerivedClass的对象

  DerivedClass c=new DerivedClass();
在这一行,您将获得两个控制台输出

  This is Base Class
  This is Derived Class
这是因为构造函数是从基调用到派生的。在您的情况下,当您调用
resume
构造函数时,它会查找
profile
的默认构造函数。它确实找到profile的构造函数,但这里的构造函数有3个参数,因此它希望您提供3个参数,您可以使用

  public resume(string fname, string lanme, string des, string vol, string ach)
         :this(10,"","")
  {
  }
或者提供一个没有参数的默认构造函数

 public profile()
 {
 }

除非您不使用参数调用“super class”构造函数,否则就不需要在“super class”中创建构造函数。编译器不会抱怨,因为他需要一个无参数的基构造函数,但因为他没有添加
this(…)
to在派生类构造函数中,假定它具有one@Siddharth好了,现在这更有意义了,你已经有了答案——但是为什么你要用小写字母作为你的类名呢。虽然我知道pascal和camel的大小写,但我还是养成了在编码过程中在命名过程中使用它们的习惯@Carsteni已经发布了改进的问题,请告诉我您是否可以帮助我现在我尝试使用第一个选项,但它说exp、qual和skill在当前上下文中不存在。虽然它通过第二个选项工作,用于将数据传递到这里的配置文件中,但对于exp,我通过了10,对于qual,对于skill,我通过了10。