【发布时间】:2017-11-05 10:11:08
【问题描述】:
抱歉,问题太长了!我一直在尝试使用 get/set 访问器,但遇到了问题。
举个例子,我有一个 Vector2D 类,它有私有的双精度 x 和 y 值以及这些值的公共访问器 X 和 Y。我还有一个公共方向属性(自定义类型角度,它本身具有公共双度数和弧度属性)。这个 Direction 属性有一个 get 访问器,它根据 X 和 Y 的值返回一个新的 Angle 对象,以及一个 set 访问器,它根据新的角度值传入。
因此,如果您有一个名为 vector 的 Vector2D,则可以使用 vector.Direction = new Angle(0),它可以正常工作。但自然也可以写成 vector.Direction.Degrees = 0。这不会导致错误,但也不能按预期工作,因为向量的 x 和 y 值没有更新。
经过思考,我明白为什么会发生这种情况。当你编写vector.Direction.Degrees时,它使用Vector2D中的get访问器,它根据X和Y返回一个新的Angle,然后它访问Degrees属性及其set that 对象上的 em> 访问器,而不是原始矢量对象上 Direction 属性的 set 访问器。换句话说,vector.Direction 上的 set 访问器根本不会在该场景中使用,因此 x 和 y 值不会更新。我想这是有道理的。
您可以访问 vector.Direction.Degrees 并尝试将其设置为不同的值,但实际上这并没有做任何事情,这显然令人困惑。但我也看到这种行为是有意的。我的问题是,有什么好的方法来处理这个问题?
提前致谢!
编辑 - 这是我的类定义的相关部分:
Vector2D 类
private double x;
private double y;
public double X { get => x; set => x = value; }
public double Y { get => y; set => y = value; }
public Angle Direction
{
get
{
return new Angle(X, Y);
}
set
{
double previousMagnitude = Magnitude;
X = Math.Cos(value.Radians) * previousMagnitude;
Y = Math.Sin(value.Radians) * previousMagnitude;
}
}
【问题讨论】:
-
尝试重载 = 运算符以使用 set 函数。
-
你能在问题中显示你的类定义吗?可能可以对其进行修改以使其正常工作。
-
这个问题确实需要代码来说明你在问什么。
-
@SvSv 在 C# 中没有重载赋值。
标签: c# vector get set accessor