2013-12-21 122 views
1

我目前正在学习一个涉及继承和构造函数的程序。我实际上是C#中的新手,所以我只是想知道为什么下面的代码在第57行有一个错误,它表示贷款不包含带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; 
     } 
    } 
} 
+0

检查http://stackoverflow.com/questions/7230544/c-sharp-error-parent-does-not-contain-a-constructor-that-takes-0-arguments – argaz

回答

2

只需添加调用基类的构造

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参数没有构造函数。所以要么创建一个,要么调用其中一个。

+0

感谢您的纠正,马特:) –

0

你得到这个错误,因为你的Loan类不包含任何默认构造函数。默认构造器意味着,构造器没有任何指示(参数)。

只要你在任何类中创建一个参数的构造函数很快,默认构造函数被破坏,因此,你不能像这样创建该类的实例:

Loan obj = new Loan(); 

,除非你创建一个默认的构造函数(不带任何参数)

在您的贷款类

public Loan() 
{ 
} 
2

还创建此当你不声明构造,C#编译器会生成一个对无米之一。但是当你声明一个带参数的构造函数时,C#编译器不会给你那个默认的,所以你必须编写一个。

public Loan() 
{ 
} 
+0

哦,我明白这就是为什么我需要声明一个无参数的构造函数。另一个问题是代码运行,但在这些行中,Console.WriteLine(“{1}的贷款#{0}用于Php {2}”,aCarLoan.LoanNumber,aCarLoan.LastName,aCarLoan.LoanAmount.ToString(“0.00” )); Console.WriteLine(“贷款#{0}用于{1} {2}”,aCarLoan.LoanNumber,aCarLoan.Year,aCarLoan.Make);'它不显示aCarLoan.LoanNumber和aCarLoan.LastName 。为什么? – user3103939

+0

@ user3103939这是因为当你创建'CarLoan'时,无参数的空构造函数在基类上运行。在'Loan'属性设置的基类中没有运行的构造函数。因此,也许在你的情况下,重载'Loan'的构造函数是一个坏主意。对于没有无参数实例构造函数的类来说是好的;继承人必须知道。 –

0

在C#中的所有类从Object类继承,如果没有定义参数的构造函数,类从Object类继承一个默认的无参数的构造函数,但是如果你定义一个构造函数,需要一些参数,默认构造函数都会被忽略。所以在这种情况下,你必须定义一个参数的构造函数:

public Loan() 
{ 

} 
0

您的来电创建CarLoan对象:

CarLoan aCarLoan = new CarLoan(444, "Carlisle", 30000.00, 2011, "BMW"); 

调用此构造函数:

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类参数的构造函数:

public Loan() 
    { 
    } 

另一种选择是使用由@Ondrej雅纳切克建议的解决方案。