如果我上课,请告诉Car。
class Car {
private Color m_Color;
private int m_Passengers;
}
现在,当我在这个状态下上课时,我在我的软件中的X个位置实现了这个。后来,我的老板说他也想存储汽车的最高速度。无论如何,他是一个好人,应该增加他的财产。
class Car {
private Color m_Color;
private int m_Passengers;
private int m_MaxSpeed;
}
通过这个工作流程,我们可能会在一段时间后得到类似的东西
class Car {
private Color m_Color;
private int m_Passengers;
private int m_MaxSpeed;
private int m_Year;
private List<Seats> m_Seats;
private DateTime m_LatestCHeckup;
private double m_GasUsage;
}
这没关系,但该类的第1版和第2版已经实现了更少的属性。我如何确定,如果我在对象上添加属性,该属性必须在从同一个类发起的所有其他对象上使用?
编辑: 清除它。
我用它作为我的第一辆车:
Car c = new Car();
c.m_Color = Color.White;
c.m_Passengers = 4;
这是我的第二辆车:
Car c2 = new Car();
c2.m_Color = Color.White;
c2.m_Passengers = 4;
c2.m_MaxSpeed=200;
和第3辆车
Car c3 = new Car();
c3.m_Color = Color.Green;
c3.m_Passengers = 8;
c3.m_MaxSpeed=180;
c3.m_Year = 2000;
c3.m_Seats = mySeatList;
c3.m_LatestCheckup = Datetime.Now;
c3.m_GasUsage=1.8;
我想确保在我将它添加到课程中时,在c和c2上添加GasUsage。但是c和c2是很久以前创建的,当时GasUsage不存在。如何防止对象没有使用所有属性?我可能有一个类,但有2000个对象。
我想要这种行为的原因是因为我可能会遍历所有汽车对象并计算他们使用了多少汽油。或者类似的。如果并非所有对象在GasUsage中都具有值,则calc将失败。
答案 0 :(得分:1)
如果您需要初始化需要的属性,则应在构造函数中声明它们。任何可选值都可以用于属性。
如果向Car
类添加任何必需的属性,则应将它们添加到构造函数中,然后编译将失败,直到先前创建的值被修复为止。
从你的评论中看起来你想要添加一个包含所有声明属性的接口,然后在实现类中创建所有构造函数参数:
public interface ICar {
Color Color { get; }
int Passengers { get; }
...
double GasUsage { get; }
}
class Car : ICar {
public Car(Color color, int passengers, int maxSpeed, ..., double gasUsage) {
this.m_Color = color;
this.m_Passengers = passengers;
...
this.m_GasUsage
}
private Color m_Color;
private int m_Passengers;
}
答案 1 :(得分:0)
假设必须使用&#39;属性&#39;意味着您希望实例化对象为每个新属性设置一个值,然后您要么更改构造函数以要求新属性,为新属性设置默认值,要么在调用对象上的方法时引发异常需要设置一个值。
汽车类的第一个版本:
class Car
{
public Car(Color mColor, int mPassengers)
{
m_Color = mColor;
m_Passengers = mPassengers;
}
private Color m_Color;
private int m_Passengers;
}
具有默认值的构造函数的汽车类的第二个版本:
class Car
{
public Car(Color mColor, int mPassengers, int mMaxSpeed = 130)
{
m_Color = mColor;
m_Passengers = mPassengers;
m_MaxSpeed = mMaxSpeed;
}
private Color m_Color;
private int m_Passengers;
private int m_MaxSpeed;
}
答案 2 :(得分:0)
类实例的初始化也可以使用需要所有属性的构造函数来完成;一旦添加了新属性,所有的instatiations就会在语法上变得不正确。