C# 继承和构造函数中出现错误

C# 继承和构造函数中出现错误,c#,oop,inheritance,constructor,C#,Oop,Inheritance,Constructor,我目前正在研究一个涉及继承和构造函数的程序。我实际上是C#的新手,所以我只是想知道为什么下面的代码在第57行有一个错误,它说loan不包含接受0个参数的构造函数。请帮我分析一下有什么问题。非常感谢你。 使用制度 class DemoCarLoan3 { static void Main() { Loan aLoan = new Loan(333, "Hanson", 7000.00); CarLoan aCarLoan = new CarLoan(444, "Ca

我目前正在研究一个涉及继承和构造函数的程序。我实际上是C#的新手,所以我只是想知道为什么下面的代码在第57行有一个错误,它说loan不包含接受0个参数的构造函数。请帮我分析一下有什么问题。非常感谢你。 使用制度

class DemoCarLoan3
{
    static void Main()
    {
        Loan aLoan = new Loan(333, "Hanson", 7000.00);
CarLoan aCarLoan = new CarLoan(444, "Carlisle", 30000.00, 2011, "BMW");
        Console.WriteLine("Loan #{0} for {1} is for Php{2}",
        aLoan.LoanNumber, aLoan.LastName,
        aLoan.LoanAmount.ToString("0,000.00"));
        Console.WriteLine("Loan #{0} for {1} is for Php{2}",
aCarLoan.LoanNumber, aCarLoan.LastName,
aCarLoan.LoanAmount.ToString("0.00"));
        Console.WriteLine(" Loan #{0} is for a {1} {2}",
        aCarLoan.LoanNumber, aCarLoan.Year,
        aCarLoan.Make);
        Console.ReadLine();
    }
}

class Loan
{
    public const double MINIMUM_LOAN = 5000;
    protected double loanAmount;
    public int LoanNumber { get; set; }
    public string LastName { get; set; }
    public double LoanAmount
    {
        set
        {
            if (value < MINIMUM_LOAN)
                loanAmount = MINIMUM_LOAN;
            else
                loanAmount = value;
        }
        get
        {
            return loanAmount;
        }
    }

    public Loan(int num, string name, double amount)
    {
        LoanNumber = num;
        LastName = name;
        LoanAmount = amount;
    }
}

class CarLoan : Loan
{
    private const int EARLIEST_YEAR = 2006;
    private const int LOWEST_INVALID_NUM = 1000;
    private int year;

    public CarLoan(int num, string name, double amount, int year, string make)
    {
        Year = year;
        Make = make;
    }

    public int Year
    {
        set
        {
            if (value < EARLIEST_YEAR)
            {
                year = value;
                loanAmount = 0;
            }
            else
                year = value;
        }
        get
        {
            return year;
        }
    }

    public string Make { get; set; }

    public new int LoanNumber
    {
        get
        {
            return base.LoanNumber;
        }
        set
        {
            if (value < LOWEST_INVALID_NUM)
                base.LoanNumber = value;
            else
                base.LoanNumber = value % LOWEST_INVALID_NUM;
        }
    }
}
class DemoCarLoan3
{
静态void Main()
{
Loan aLoan=新贷款(333,“汉森”,7000.00);
CarLoan aCarLoan=新CarLoan(444,“卡莱尔”,30000.002011,“宝马”);
WriteLine(“用于{1}的Loan{0}是用于Php{2}”,
aLoan.LoanNumber,aLoan.LastName,
aLoan.LoanAmount.ToString(“0000.00”);
WriteLine(“用于{1}的Loan{0}是用于Php{2}”,
aCarLoan.LoanNumber,aCarLoan.LastName,
阿卡洛安·洛纳蒙特·托斯特林(“0.00”);
WriteLine(“Loan{0}代表{1}{2}”,
阿卡洛数,阿卡洛年,
aCarLoan.Make);
Console.ReadLine();
}
}
集体贷款
{
公共建筑双最低贷款=5000;
受保护的双loanAmount;
public int LoanNumber{get;set;}
公共字符串LastName{get;set;}
公共双LoanAmount
{
设置
{
如果(价值<最低贷款)
loanAmount=最低贷款额;
其他的
loanAmount=价值;
}
得到
{
返回loanAmount;
}
}
公共贷款(整数、字符串名称、双倍金额)
{
LoanNumber=num;
LastName=名称;
LoanAmount=金额;
}
}
CarLoan类:贷款
{
私人建筑最早年份=2006年;
private const int lower\u INVALID\u NUM=1000;
私人国际年;
公共CarLoan(整数、字符串名称、双倍金额、整数年、字符串品牌)
{
年=年;
制造=制造;
}
公共国际年
{
设置
{
if(值<最早年份)
{
年份=价值;
loanAmount=0;
}
其他的
年份=价值;
}
得到
{
回归年;
}
}
公共字符串Make{get;set;}
公共新国际贷款编号
{
得到
{
返回base.LoanNumber;
}
设置
{
如果(值<最低值\u无效\u数值)
base.LoanNumber=值;
其他的
base.LoanNumber=值%lower\u无效\u NUM;
}
}
}

您将获得该错误,因为您的
贷款
类不包含任何默认构造函数。默认构造函数是指没有任何分段(参数)的构造函数

一旦在任何类中创建参数化构造函数,默认构造函数就会被销毁,因此,您不能像这样创建此类的实例:

  Loan obj = new Loan();
除非创建默认构造函数(不带任何参数)

在你的贷款类中也创建这个

public Loan()
{
}

您将获得该错误,因为您的
贷款
类不包含任何默认构造函数。默认构造函数是指没有任何分段(参数)的构造函数

一旦在任何类中创建参数化构造函数,默认构造函数就会被销毁,因此,您不能像这样创建此类的实例:

  Loan obj = new Loan();
除非创建默认构造函数(不带任何参数)

在你的贷款类中也创建这个

public Loan()
{
}

如果不声明构造函数,C#编译器将生成一个无参数的构造函数。但是,当您声明一个接受args的构造函数时,C#编译器不会给您默认的构造函数,因此您必须编写一个

 public Loan()
 {
 }

如果不声明构造函数,C#编译器将生成一个无参数的构造函数。但是,当您声明一个接受args的构造函数时,C#编译器不会给您默认的构造函数,因此您必须编写一个

 public Loan()
 {
 }

只需添加对基本构造函数的调用

public CarLoan(int num, string name, double amount, int year, string make) 
    : base(num, name, amount)
{
    Year = year;
    Make = make;
}
当您在派生类中声明一个不调用基构造函数的构造函数时,它会自动调用一个不存在0个参数的构造函数。如果您将代码保持原样,它将编译为

public CarLoan(int num, string name, double amount, int year, string make) 
    : base()
{
    Year = year;
    Make = make;
}

但这是无效的,因为基类中没有包含0个参数的构造函数。因此,要么创建一个,要么调用现有构造函数中的一个。

只需添加对基本构造函数的调用即可

public CarLoan(int num, string name, double amount, int year, string make) 
    : base(num, name, amount)
{
    Year = year;
    Make = make;
}
当您在派生类中声明一个不调用基构造函数的构造函数时,它会自动调用一个不存在0个参数的构造函数。如果您将代码保持原样,它将编译为

public CarLoan(int num, string name, double amount, int year, string make) 
    : base()
{
    Year = year;
    Make = make;
}
但这是无效的,因为基类中没有包含0个参数的构造函数。因此,要么创建一个,要么调用现有类中的一个。

c中的所有类继承自
对象
类,如果不定义无参数构造函数,则类继承自
对象
类的默认无参数构造函数,但如果定义了带一些参数的构造函数,默认构造函数将被忽略。因此在这种情况下,您必须定义一个无参数构造函数:

public Loan()
{

}
    public CarLoan(int num, string name, double amount, int year, string make)
    {
       ...
    }
c#中的所有类都继承自
对象
类,如果未定义无参数构造函数,则类继承自
对象
类的默认无参数构造函数,但如果定义了带一些参数的构造函数,默认构造函数将被忽略。因此在这种情况下,您必须定义一个无参数构造函数:

public Loan()
{

}
    public CarLoan(int num, string name, double amount, int year, string make)
    {
       ...
    }

您创建
CarLoan
对象的调用:

    CarLoan aCarLoan = new CarLoan(444, "Carlisle", 30000.00, 2011, "BMW");
调用此构造函数:

public Loan()
{

}
    public CarLoan(int num, string name, double amount, int year, string make)
    {
       ...
    }
可能不明显的是,
CarLoan
构造函数的编译方式就像您编写的那样:

    public CarLoan(int num, string name, double amount, int year, string make)
        : base()
    {
       ...
    }
在构造派生对象时,基类构造函数首先被自动调用(即使您没有显式地调用)。更一般地说,对象是以自顶向下的方式构造的,从最基本的类到最派生的类。因为您没有指定要使用的
Loan
构造函数,所以编译器使用