gpt4 book ai didi

c# - 属性实现——菜鸟知识匮乏

转载 作者:太空宇宙 更新时间:2023-11-03 16:28:42 25 4
gpt4 key购买 nike

抱歉,我确定这个问题之前已经得到了回答,但我无法将我的问题浓缩为可在谷歌搜索上搜索到的短语。

我有一个 Pt3 类,它是一个 3d 笛卡尔点(x、y、z 属性加上一些其他好东西)。我使用 Pt3 类型作为 RegionProvider 类中的获取/设置属性值 - 对于 Location 和 Normal。

Location 属性很好,我不关心属性是如何设置的:

//Location set method 1 - sweet...
RegionProvider Foo = new RegionProvider();
Foo.Location.x = 10;
Foo.Location.y = 20;
Foo.Location.z = 30;

//Location set method 2 - also sweet...
RegionProvider Foo2 = new RegionProvider();
Foo2.Location = new Pt3(10, 20, 30);

虽然 Normal 属性需要不同的行为。如果需要,我希望 RegionProvider 类将输入规范化为 Normal 属性,例如如果调用者将“正常”值设置为 40、50、60,则 RegionProvider 类将标准化为 0.4558、0.5698、0.6838(以给出向量长度 == 1)。如果调用者执行以下操作,一切都很好......

//Normal set method A - sweet...
Foo.Normal = new Pt3(40, 50, 60);

...但是如果他们这样做会带来悲伤:

//Normal set method B - grief...
Foo2.Normal.x = 40;
Foo2.Normal.y = 50;
Foo2.Normal.z = 60;

...因为 RegionProvider 类将在设置每个元素时规范化。我想要做的是防止调用者看到 Normal 属性的 x、y、z,因此他们被迫使用上面的方法“A”。

一个解决方案可能是根本不规范化属性集,而是规范化属性获取,但这看起来像是伪造的。

就其值(value)而言,这是我的 Normal 属性声明:

/// <summary>
/// Property for the objects normal
/// </summary>
public Pt3 Normal
{
set
{
_normal = Bit555ModelCore.NormalizeVector(value);
this.NotifyPropertyChanged("Normal");
}
get
{
return _normal;
}
}

提前为任何帮助干杯....

最佳答案

我认为你有两个选择:

  1. 确保 Pt3 的属性永远不会通过使整个类不可变来单独设置:

    class Pt3
    {
    public Pt3(double x, double y, double z)
    {
    X = x;
    Y = y;
    Z = z;
    }

    public double X { get; private set; }
    public double Y { get; private set; }
    public double Z { get; private set; }
    }
  2. 有两个类:Pt3MutablePt3Immutable(或一些更好的名称)。 Pt3Immutable 将是不可变的,因此您可以安全地将它用于 NormalPt3Mutable 是可变的,因此如果您将它用于 Location,方法 1 仍然有效。

    然后您可以使用强制转换运算符在两种类型之间进行转换:从 Pt3MutablePt3Immutable 的隐式强制转换以及相反的显式强制转换。

    <

关于c# - 属性实现——菜鸟知识匮乏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11604474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com