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