2016-11-14 47 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.在他的回答中有一个很好的代码样本,如果这是你想要的路线。