2012-02-01 83 views
1

我的問題可能很簡單,但我剛剛開始在C#中編程。類型「MyProject.Bike」不包含需要'0'參數的構造函數C#

我的問題是,如上所列:「類型」MyProject.Bike「不包含一個構造函數,它需要'0'參數」。

我不明白,因爲我沒有試圖用空圓括號對這個構造函數進行調用,而閱讀類似的問題都回答「你必須多/沒有足夠的參數......」。

我剛纔提出這個學習,但我認爲繼承是一個非常重要的概念,所以我希望能夠做到這一點......

我的代碼:

using System; 
namespace MijnConsoleProject 
{ 
    public class Bike 
    { 
     protected int speed = 0; 
     public String name 
     { 
      get; 
      set; 
     } 
     public void speedUp(int increment) 
     { 
      this.speed += increment; 
     } 
     public void slowDown(int decrement) 
     { 
      this.speed -= decrement; 
      { 

     public override string ToString() 
     { 
      return name + ": speed = " + speed; 
     } 

     public Bike(int initSpeed) 
     { 
      this.speed = initSpeed; 
     } 
    } 

    public class GearedBike : Bike 
    { 
     private int gear; 

     public GearedBike(string name) 
     { 
      this.name = name; 
     } 

     public bool changeGear(int gear) 
     { 
      if(gear < 8 && gear > 0) 
      { 
       this.gear = gear; 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 

     public override string ToString() 
     { 
      return name + ": speed=" + speed + ", gear=" +gear; 
     } 

     public static void main(String[] args) 
     { 
      Bike fiets = new Bike(10); 
      Console.WriteLine("[Normal Bike:]"); 
      Console.WriteLine("{0}\n", fiets); 

      GearedBike fiets2 = new GearedBike("Fiets"); 
      Console.WriteLine("[Geared Bike:]"); 
      Console.WriteLine("{0}\n", fiets2); 
     } 
    } 
} 
+0

嘿,第二部分突出顯示!但第一部分仍然不是... – 11684 2012-02-01 14:46:30

+0

它在哪一行告訴你有一個錯誤? – 2012-02-01 14:48:27

+0

您需要縮進代碼4個空格。或者選擇它並點擊**'{}'**按鈕。 – Oded 2012-02-01 14:49:55

回答

2

Bike類只有一個構造函數:

public Bike(int initSpeed) 
    { 
     this.speed = initSpeed; 
    } 

這需要一個參數。

當您派生派生類的構造函數從基類調用構造函數的類時。

在您的GearedBike類的構造函數中,您沒有指定Bike的哪個構造函數要調用,因此編譯器假定Bike()不存在。

你可能想要類似下面的東西,我們指定要調用的基礎構造函數,並傳入適當的值。

public GearedBike(string name) 
     : base(0) 
    { 
     this.name = name; 
    } 

您可能還需要一個GearedBike構造在這裏你可以設置速度和名字,象下面這樣:

public GearedBike(string name, int initSpeed) 
     : base(initSpeed) 
    { 
     this.name = name; 
    } 
+0

我可以在基類的構造函數中獲得一個變量嗎? – 11684 2012-02-01 14:51:27

+0

看到我的編輯,我認爲這就是你要做的。 – 2012-02-01 14:52:19

+0

謝謝! ...我不能接受這個答案... – 11684 2012-02-01 14:52:57

2

構造public GearedBike(string name) { ... }public GearedBike(string name) : base() { ... }的簡寫

您必須用您的子類構造函數中的參數調用基類構造函數,或者向您的基類中添加0-param構造函數。

public GearedBike(string name) : base(42) { 
    // ... 
} 
0

構造函數不能被繼承所以在類的擴展,你必須調用基類construcotr自行車:

public GearedBike(string name):base(name) 
     { 
      this.name = name; 
     } 

你不必這樣做,如果你的基類已經得到了參數的構造函數

0

GearedBike不調用基類的構造函數。如果您沒有明確地調用基類的構造函數,編譯器會調用基類的默認構造函數。基類不包含默認構造函數;因此你會收到一個錯誤,說明這種情況。

0

C#編譯器可以生成一個默認的構造函數可能看起來像

public Bike() 
{ 

} 

如果類型沒有任何用戶定義的構造這纔會發生。在你的情況下,類自行車有一個構造函數接受一個int:

public Bike(int initSpeed) 
{ 
    this.speed = initSpeed; 
} 

Thefore編譯器沒有產生一個默認參數的構造函數。


代碼中的類型GearedBike通過調用:base()(這是由編譯器添加的)使用父類的構造函數和此調用後來失敗,因爲在基類無參數的構造函數。

相關問題