C#基本对象和类

时间:2013-01-16 15:38:35

标签: c# class object inheritance

我在下面发布了我的代码。

当我使用时,我的问题是程序崩溃:

myCarLabel.Text = MyCar.ToString();

我做错了什么?

我想将MyCar.BrandMyCar.Year的值输出到myCarLabel。

它可以使用:myCarLabel.Text = comboBoxBrand.Text +“\ n”+ comboBoxYear.Text;

但是后来我使用我的课等等而失去了全部意义..任何建议?

class Vehicle
{
    public string Brand { get; set; }
    public string Year { get; set; }

    // GetVehicleInfo() ska returnera värdena från MyCar
    public string GetVehicleInfo()
    {
        return Brand + "\n" + Year;
    }
}

class Car : Vehicle
{
    public string Kolor { get; set; }
}


private Car MyCar;    

private void Form1_Load(object sender, EventArgs e)
{       
    MyCar = new Car();
    MyCar.Brand = comboBoxBrand.Text;
    MyCar.Year = comboBoxYear.Text;
}


private void button1_Click(object sender, EventArgs e)
{
    // comboBoxBrand.Text + "\n" + comboBoxYear.Text;

    myCarLabel.Text = MyCar.ToString();
    myCarLabel.BackColor = colorDialog.Color;
}

7 个答案:

答案 0 :(得分:2)

我不明白你的“程序崩溃”是什么意思,但看着你的代码,你应该这样做:

myCarLabel.Text = MyCar.GetVehicleInfo();

您没有覆盖ToString方法。默认的ToString实现将返回有关命名空间的一些元数据。

答案 1 :(得分:1)

崩溃可以归结为1000件事。在您的具体示例中,可能与事实相关

myCarLabel.Text = MyCar.ToString();
  • MyCar为空

  • myCarLabel为空

  • 或两者

另外,我没有在您的班级中看到ToString(..)方法的覆盖,例如:

class Car : Vehicle
{
    public string Kolor { get; set; }

    public override string ToString() {
          return Kolor;
    }
}

这些只是基本的例子,你可能需要什么,很难从你的问题中扣除一些具体内容。

答案 2 :(得分:0)

public class Vehicle
{
     public Vehicle()
     {
         // do instantiations here so that none of your members are null
     }

     public override string ToString()
     {
         return Brand + "\n" + Year;
     }
}

public class Car : Vehicle
{
     public Car() : base()
     {
         // Note that the base default constructor is called with : base()
         // then perform Car-specific instantiations here.
     }
     ...
     public override string ToString()
     {
         // Now, you can refer to the super class's ToString() if you want to.
         return base.ToString() + "\n" + Kolor;
     }
}

答案 3 :(得分:0)

您也可以在Vehicle类覆盖ToString()上使用继承(如示例所示)当您进行此操作时,Car类将使用函数ToString()Vehicle类上,因为实际上Car类在ToString()类上使用函数Object。最后你不需要使用表达式MyCar.Tostring(),只需使用函数MyCar(myCarLabel.Text = MyCar)中第4行的button1_Click

class Vehicle
{
    public string Brand { get; set; }
    public string Year { get; set; }

    // GetVehicleInfo() ska returnera värdena från MyCar
    public string GetVehicleInfo()
    {
        return Brand + "\n" + Year;
    }

    public override string ToString() {
        return GetVehicleInfo();
    }
}

class Car : Vehicle
{
    public string Kolor { get; set; }
}


private Car MyCar;    

private void Form1_Load(object sender, EventArgs e)
{       
    MyCar = new Car();
    MyCar.Brand = comboBoxBrand.Text;
    MyCar.Year = comboBoxYear.Text;
}


private void button1_Click(object sender, EventArgs e)
{
    // comboBoxBrand.Text + "\n" + comboBoxYear.Text;

    myCarLabel.Text = MyCar;
    myCarLabel.BackColor = colorDialog.Color;
}

答案 4 :(得分:0)

为了找到崩溃的原因,这里有几个检查:

  • 确保Form.Load事件已正确设置为您的方法并被调用。您可以在Form1_Load内的第一行或括号上设置断点( F9 ),以确保它被击中。

  • 在行myCarLabel.Text = MyCar.ToString()上设置断点。将鼠标悬停在myCarLabelMyCar上以确保它们在调试器中不为空。

至于代码的改进,这里有一些:

首先,您尚未在ToString()Car类上覆盖Vehicle。虽然这不是必需的,但您的ToString()方法会在此返回一个相当无意义的YourNamespace.Car字符串。考虑添加覆盖:

public override string ToString()
{ 
  // Format this however you'd like:
  return string.Format("{0} {1}", this.Year, this.Brand);
}

其次,您要在Car事件中创建Form.Load实例,这意味着对ComboBox的更改不会反映在您的对象中。因此,如果用户更改了所选的品牌,则不会更新该对象。考虑将其移至Button.Click事件:

void myButton_Click(object sender, EventArgs e)
{
  var car = new Car();
  car.Year = yearComboBox.Text;
  car.Brand = brandComboBox.Text;

  myCarLabel.Text = car.ToString();
  myCarLabel.BackColor = colorDialog.Color;
}

此外,您不需要将Car存储为成员变量。如果您需要自定义对话框或Form来添加/编辑汽车条目,最好创建返回Car或在自定义Form上具有类似属性的方法。例如:

void addCarButton_Click(object sender, EventArgs e)
{
  var dialog = new AddCarForm();
  var result = dialog.ShowDialog();

  if(result != DialogResult.OK) return;

  var newCar = dialog.Car;

  // Do something with the newly created car.      
}

但是,如果必须保留成员变量,则应以小写字母myCar而不是MyCar开头,以避免与属性,常量和方法混淆。

答案 5 :(得分:-1)

您必须覆盖类的toString()方法

        public override string ToString()
    {
        return comboBoxBrand.Text +"\r\n"+comboBoxYear.Text;
    }

答案 6 :(得分:-1)

我没有看到MyCar被初始化,也没有看到任何异常处理。因此,您的程序必然会崩溃