说我有一个类中的属性:

Vector3 position{get; set;}

所以我的地方创建一个类的实例,现在我想改变position.x,那现在因为getter和setter设置和获取整个对象是不可能的。所以,我必须作出一个临时的Vector3改变它的值,然后分配给它。

通常我会作出位置公共字段,使得问题将得到解决。但我不能做到这一点在这种情况下,因为位置是一个接口的实现和接口不能有字段。

因此,如何能我此解决的最佳方式。

编辑:的Vector3是一个结构,从而其值类型

有帮助吗?

解决方案

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.Xobj.Yobj.Z如果你只需要改变一个维度,或更改obj.Position改变这一切。

如果您需要的名字position实现一个接口,然后执行它明确:

Vector3 IWhateverInterface.position {
    get {return position;}
    set {position = value;}
}

其他提示

是对直接的解决方案在某种程度上不能接受?

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

这有什么错呢?这似乎完全明了。

这与可变的值类型的问题之一。您可以创建新的X值的值类型的新实例,并重新分配到财产。可以通过提供有用的构造或添加返回修改的对象的方法(而不是通过修改的值)使实例创建更容易。

<强>预P.S 锯太晚Vector3是一个值类型;以下职位,因此不会有很大帮助。遗憾的那个错误。

好了,而接口不能有字段,它们可以的具有属性,e.g:

interface IVector3
{
    double X { get; set; }
    double Y { get; set; }
    double Z { get; set; }
}

在你的Vector3,你只是实现这些和其他事物一样:

class Vector3 : IVector3
{
    double IVector3.X
    {
        get { ... }
        set { ... } 
    }
    ...
}

现在回到你position财产。你初始化期间扎属性到一个固定的实例,并只提供一个吸气剂:

Vector3 position
{
    get
    {
        return _position;
    }
}

private Vector3 _position = new Vector3(...);

通过使属性只读(即没有setter),可以确保它不会有一个新的Vector3对象替换。相反,你把它绑在初始化时固定的实例(_position)。但是你可以通过指定新值Vector3position.X,或position.Y改变position.Z

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top