说我在课堂上有一个属性:
Vector3 position{get; set;}
所以我在某处创建了该类的实例,现在我想改变position.x,这是不可能的,因为getter和setter设置并获取整个对象。所以我必须让一个临时的Vector3改变它的值,然后分配它。
通常情况下,我会将位置设为公共字段,以便解决问题。但是我不能在这种情况下这样做,因为position是接口的实现,接口不能有字段。
那么我怎样才能以最好的方式解决这个问题。
编辑:Vector3是一个结构,因此它是一个值类型
答案 0 :(得分:9)
直截了当的解决方案是否不可接受?
foo.position = new Vector(newX, foo.position.Y, foo.position.Z);
这有什么问题?这看起来非常简单。
答案 1 :(得分:5)
IMO,这是最简单的答案:
private Vector3 position;
public Vector3 Position {
get {return position;}
set {position = value;} // with @Mehrdad's optimisation
}
public float X {
get {return position.X;}
set {position.X = value;}
}
public float Y {
get {return position.Y;}
set {position.Y = value;}
}
public float Z {
get {return position.Z;}
set {position.Z = value;}
}
现在,如果您只需要更改一个维度,或者更改obj.X
以更改所有内容,则可以更改obj.Y
,obj.Z
和obj.Position
。
如果您需要名称position
来实现接口,请明确地执行:
Vector3 IWhateverInterface.position {
get {return position;}
set {position = value;}
}
答案 2 :(得分:2)
这是可变值类型的问题之一。您可以使用新的X
值创建值类型的新实例,然后重新分配给该属性。您可以通过提供有用的构造函数或添加返回修改对象的方法(而不是修改值)来使实例创建更容易。
答案 3 :(得分:0)
Pre-P.S。:看到Vector3
是值类型太晚了;因此,以下职位不会有太大帮助。抱歉,这个错误。
嗯,虽然接口不能有字段,但可以具有属性,例如:
interface IVector3
{
double X { get; set; }
double Y { get; set; }
double Z { get; set; }
}
在Vector3
中,您只需实现其他所有内容:
class Vector3 : IVector3
{
double IVector3.X
{
get { ... }
set { ... }
}
...
}
现在回到您的position
财产。在初始化期间将属性绑定到固定实例,并仅提供getter:
Vector3 position
{
get
{
return _position;
}
}
private Vector3 _position = new Vector3(...);
通过将属性设置为只读(即没有setter),可以确保它不会被新的Vector3
对象替换。相反,您在初始化时将其绑定到固定实例(_position
)。但您可以通过为Vector3
,position.X
或position.Y
分配新值来更改position.Z
。