我是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'。
那么,是否可以将两个电机对象绑定到单选按钮?非常感谢任何帮助。
答案 0 :(得分:3)
在您当前的代码中,您尝试将bool
值分配给Motor
,这是无法完成的,因为您的代码是强类型的。
您的largeMotor
和smallMotor
对象之间没有区别。如果您稍后需要知道电机是大还是小,您的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
。现在,汽车有发动机和轮胎。发动机和轮胎也是完整的。因此,您需要Engine
和Tyre
的课程。接下来,你知道汽车有发动机和轮胎。要在代码中关联这三个类,您可以使用以下属性:
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对象。一旦你深入挖掘并绊倒抽象类,你就会意识到这不是真的。但请留待以后。