3

假设我在一个类中有一个属性:

Vector3 position{get; set;}

所以我在某处创建了该类的实例,现在我想更改 position.x,这现在是不可能的,因为 getter 和 setter 设置并获取整个对象。所以我必须让一个临时的 Vector3 改变它的值,然后分配它。

通常我会将位置设为公共领域,以便解决问题。但在这种情况下我不能这样做,因为位置是接口的实现,接口不能有字段。

那么我怎样才能以最好的方式解决这个问题。

编辑: Vector3 是一个结构,所以它是一个值类型

4

3 回答 3

9

直截了当的解决方案在某种程度上是不可接受的吗?

foo.position = new Vector(newX, foo.position.Y, foo.position.Z);

那有什么问题?这似乎非常简单。

于 2010-01-17T23:24:15.663 回答
6

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.Yobj.Zobj.Position

如果您需要名称position来实现接口,请明确执行:

Vector3 IWhateverInterface.position {
    get {return position;}
    set {position = value;}
}
于 2010-01-17T22:37:54.493 回答
2

这是可变值类型的问题之一。您可以使用新值创建值类型的新实例X并重新分配给属性。您可以通过提供有用的构造函数或添加返回已修改对象(而不是修改值)的方法来简化实例创建。

于 2010-01-17T22:24:27.410 回答