将对象绑定到单选按钮c#

时间:2015-10-20 04:17:08

标签: c# oop object

我是OOP的新手所以我不知道如果可能的话我会问什么,但是这里有。我的表格上有两个单选按钮“radiobutton1”和“radiobutton2”。我有一个名为“car1”的实例的Vehicle类。我还有一个有两个名为“smallMotor”和“largeMotor”的实例的Motor类。我正在尝试制作一个名为“SetMotor”的方法,该方法应该将smallMotor或largeMotor设置为car1的电机。该方法应该采用两个布尔值,由两个单选按钮表示,以确定为car1设置哪个电机对象。我尝试了以下,但它不起作用,并给了我错误。这是我的代码:

主要形式:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication12
{
    public partial class Form1 : Form
    {
        Motor largeMotor;
        Motor smallMotor;
        Vehicle car1;
        public Form1()
        {
            InitializeComponent();
            largeMotor = new Motor(2000);
            smallMotor = new Motor(1000);
            car1 = new Vehicle();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            car1.SetModel(textBoxModel.Text);
            car1.SetNumDoors((int)numericUpDown1.Value);
            car1.SetMotor(radioButton1.Checked, radioButton2.Checked); 
        }
    }
}

我的运动课:

    class Motor
    {
        private int power;

        public Motor(int p)
        {
            power = p;
        }
    }

车辆类:

class Vehicle
{
    private Motor motor;

    public void SetMotor(bool smallMotor, bool largeMotor)
    {
        if (largeMotor)
        {
            motor = largeMotor;
        }
        else
            motor = smallMotor;
    }
}

这给我的错误是:

  

错误6无法将类型'bool'隐式转换为'WindowsFormsApplication12.Motor'。

那么,是否可以将两个电机对象绑定到单选按钮?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

在您当前的代码中,您尝试将bool值分配给Motor,这是无法完成的,因为您的代码是强类型的。

您的largeMotorsmallMotor对象之间没有区别。如果您稍后需要知道电机是大还是小,您的Vehicle对象将无法告诉您。就你的班级结构而言,这是一个快速推荐:

class Vehicle
{
    public Motor Motor
    {
        get;
        set;
    }
}

class Motor
{
    public MotorType Type
    {
        get;
        set;
    }
}

enum MotorType
{
    Large,
    Small
}

class SomeClass
{
    public void SetMotorType(bool isSmall)
    {
        // This object would probably come from some place else
        Vehicle vehicle = new Vehicle();
        vehicle.Motor = new Motor { Type = (isSmall) ? MotorType.Small : MotorType.Large };
    }
}

现在,Vehicle.Motor.MotorType会让您随时了解电机是大还是小。

编辑:

暂时忘记编程和OOP并思考现实世界。有一辆车有发动机和轮胎。编程中的类是完整的真实World对象的表示(仅限于现在)。现在,按照这种理解,代码中应该有一个类Car。现在,汽车有发动机和轮胎。发动机和轮胎也是完整的。因此,您需要EngineTyre的课程。接下来,你知道汽车有发动机和轮胎。要在代码中关联这三个类,您可以使用以下属性:

class Car
{
public Engine Engine{get;set;}

// Since car has more than one tyres, it should be one to many relation
public List<Tyre> Tyres{get;set;}

}

现在,发动机可以分解为活塞,气缸等部件。根据您想要的颗粒度,活塞可以是发动机的属性,也可以是具有MadeOf,Diameter,Length等属性的类别为简单起见,我不会做得更深。那么,您将如何将这些属性链接到Engine?通过使用属性。因此,

class Engine{
// Or any other Piston attribute you are interested in.
public int PistonId{get;set;}

public decimal CylinderVolume{get;set;}
}

同样,轮胎将使用他们拥有的属性进行定义。像半径一样,它们是否是无内胎和其他属性。所以,

class Tyre{
public int radius{get;set;}
public bool IsTubeless{get;set;}
}

现在,您可以说Car拥有无内胎轮胎,因此我们可以将IsTubeless财产放入车内。但从逻辑上讲,Tyre类对象知道它是否是无内容更有意义。这是您定义类的方法。

之前,我提到过类代表完整的真实World对象。一旦你深入挖掘并绊倒抽象类,你就会意识到这不是真的。但请留待以后。