代码之家  ›  专栏  ›  技术社区  ›  slayerIQ

吸气剂/设置器问题

  •  3
  • slayerIQ  · 技术社区  · 16 年前

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

    Vector3 position{get; set;}
    

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

    通常情况下,我会把这个职位变成一个公共领域,这样问题就会得到解决。但在这种情况下,我不能这样做,因为位置是接口的实现,接口不能有字段。

    所以我怎样才能最好地解决这个问题呢?

    编辑:vector3是一个结构,因此它是一个值类型

    4 回复  |  直到 16 年前
        1
  •  5
  •   Marc Gravell    16 年前

    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
  •  9
  •   Eric Lippert    16 年前

    直截了当的解决方案是否不可接受?

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

    怎么了?这似乎非常简单。

        3
  •  2
  •   Mehrdad Afshari    16 年前

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

        4
  •  0
  •   stakx - no longer contributing Saravana Kumar    16 年前

    前P.S. 以下内容: 看得太晚了 Vector3 是一个值类型;因此下面的文章不会有太多帮助。为那个错误道歉。

    虽然接口不能有字段,但是它们 可以 具有属性,例如:

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

    在你 矢量3 ,您只需像其他一切一样实现这些功能:

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

    现在回到你的 position 财产。您可以在初始化期间将属性绑定到固定实例,并且只提供getter:

    Vector3 position
    {
        get
        {
            return _position;
        }
    }
    
    private Vector3 _position = new Vector3(...);
    

    通过将属性设置为只读(即没有setter),可以确保它不会被新的 矢量3 对象。相反,您将它绑定到一个固定的实例( _position )在初始化时。但是你可以改变 矢量3 通过将新值赋给 position.X , position.Y position.Z .