继承:基类和派生类中的构造方法

时间:2015-08-11 05:14:27

标签: c# oop constructor

如果构造函数必须放在派生类中,为什么需要一个不包含基类中的参数的构造函数?

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);
    }
}

这是我的代码现在我在简历构造函数中收到错误,该配置文件不包含带0参数的构造函数。

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

现在我无法理解这个原因。

3 个答案:

答案 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(); 
    }
}

你想要实现的是什么?

答案 1 :(得分:0)

OP是正确的,编译器抱怨它。如果你必须有一个带参数的构造函数,那么你将不得不在所有子类中创建一个带参数的构造函数。此外,您还必须明确地调用父的构造函数。

resume的构造函数应为:

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()的方法。

答案 2 :(得分:0)

你需要理解继承的概念。

这是一个例子

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

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

  public resume(string fname, string lanme, string des, string vol, string ach)
         :this(10,"","")
  {
  }

或提供没有参数的默认构造函数。

 public profile()
 {
 }