2016-11-14 75 views
-1

我想獲得一個預先確定的輸出(指定顏色和速度)從私有類。然而,當我問程序寫入行它打印出Car_EX_3.Car,而不是顏色和數量。初學者:輸出與預期不同

這是到目前爲止我的代碼

namespace Car_Ex_3 
{ 
    class Car 
    { 
     private string colour; 
     private double speed; 
     public Car(string colour) 
     { 
      this.colour = colour; 
     } 
     public Car(string colour, double speed) 
     { 
      this.colour = colour; 
      this.speed = speed; 
     } 
     public string GetColour() 
     { 
      return colour; 
     } 
     public double GetSpeed() 
     { 
      return speed; 
     } 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       Car car1 = new Car("red" + " " + 50d); 

       Car car2 = new Car("Yellow" +" " + 60d); 

       Console.WriteLine(car1); 
       Console.WriteLine(car2); 
       Console.ReadKey(); 
      } 
     } 
    } 
} 
+2

你沒寫,將打印顏色或數字的任何代碼。瞭解'ToString()'。 – SLaks

+2

_Console.WriteLine(car1.GetColour()); _ – Steve

+3

不應該是'新車(「黃色」,60d);' – Hank

回答

4

由於已經有很多人提到:覆蓋Object.ToString()方法會給你想要的結果。

C#中的每個類都來自System.Object類,但.ToString()方法通常只打印實例類的名稱。爲了防止這種情況,實施新的方法到您的Car類:

public override string ToString() 
{ 
    return "Car (Color: " + colour + ", Speed: " + speed.ToString() + ")"; 
} 

String.Format

public override string ToString() 
{ 
    return string.Format("Car (Color: {0}, Speed: {1})", colour, speed.ToString()); 
} 
+0

爲了使這個更清潔,你可能想讓你的代碼示例使用字符串返回字符串。格式函數與所有的連接值+字符串文字 – MethodMan

+1

我不確定這是否太高級。編輯我的回答:) –

0

你在錯誤的方式實際上做。

正確方法:

Car car1 = new Car("red", 50d); 
Car car2 = new Car("Yellow", 60d); 

Console.WriteLine("Car1 Color: " + car1.colour + " Number: " + car1.speed); 
Console.WriteLine("Car2 Color: " + car2.colour + " Number: " + car2.speed); 

你必須使用構造函數以2個參數,一個參數,顏色,第二個是速度。 在Console.WrtieLine()你直接寫類對象多數民衆贊成就是爲什麼它是給不想要的結果(Car_EX_3.Car),因爲它告訴你對象的類型由它的命名空間和類名。 你要訪問car1car2對象的colourspeed性能。

最初你在做Car car1 = new Car("red" + " " + 50d);,它正在調用一個參數縮進器,而不是兩個參數構造器,因爲"red" + " " + 50d將被編譯器轉換爲字符串。

正如上面Ian H.所建議的那樣,您可以覆蓋ToString()或使自己的方法將組合類型(您的類對象)轉換爲您所需的字符串格式並在您的代碼中使用任何位置。

0

只是爲了通過代碼:

// Don't forget to include the access modifier 
class Car 
{ 
private string colour; 
private double speed; 
// Is it valid to have just a color and not a speed as well? 
public Car(string colour) 
{ 
    this.colour = colour; 
} 
public Car(string colour, double speed) 
{ 
    this.colour = colour; 
    this.speed = speed; 
} 

// In C# this should be a property 
public string GetColour() 
{ 
    return colour; 
} 
public double GetSpeed() 
{ 
    return speed; 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Car car1 = new Car("red" + " " + 50d); 

     Car car2 = new Car("Yellow" +" " + 60d); 

     This is incorrect 
     Console.WriteLine(car1); 
     Console.WriteLine(car2); 
     Console.ReadKey(); 
    } 
} 
} 

嘗試,而不是執行以下操作:

public class Car 
{ 
private string colour; 
private double speed; 
// Is it valid to have just a color and not a speed as well? 
public Car(string colour) 
{ 
    this.colour = colour; 
    // Initialize it to 0.0 
    speed = 0.0; 
} 
public Car(string colour, double speed) 
{ 
    this.colour = colour; 
    this.speed = speed; 
} 

// In C# this should be a property 
public string Colour 
{ 
    get { return colour; } 
} 
public double Speed 
{ 
    get { return speed; } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Car car1 = new Car("red" + " " + 50d); 

     Car car2 = new Car("Yellow" +" " + 60d); 

     // Do something like the following to print what you want 
     Console.WriteLine(car1.Colour + " " + car1.Speed); 
     Console.WriteLine(car2.Colour + " " + car2.Speed); 
     Console.ReadKey(); 
    } 
} 
} 

正如其他人所提到的,你也可以通過重寫ToString()方法做到這一點。 Ian H.在他的回答中有一個很好的代碼樣本,如果這是你想要的路線。