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。