一尘不染

C#中的重载赋值运算符

c#

我知道=操作符不会过载,但是必须有一种方法可以在这里执行我想要的操作:

我正在创建代表定量单位的类,因为我做了一些物理学工作。显然,我不能仅从基元继承,但是我希望我的类的行为与基元完全一样-我只是希望它们的输入方式不同。

这样我就可以走了

Velocity ms = 0;
ms = 17.4;
ms += 9.8;

等等

我不确定该怎么做。我想我只是写一些像这样的类:

class Power
{
    private Double Value { get; set; }

    //operator overloads for +, -, /, *, =, etc
}

但是显然我不能重载赋值运算符。有什么办法可以使我获得这种行为?


阅读 867

收藏
2020-05-19

共1个答案

一尘不染

听起来您应该使用 结构 而不是类…,然后创建隐式转换运算符,以及用于加法的各种运算符等。

这是一些示例代码:

public struct Velocity
{
    private readonly double value;

    public Velocity(double value)
    {
        this.value = value;
    }

    public static implicit operator Velocity(double value)
    {
        return new Velocity(value);
    }

    public static Velocity operator +(Velocity first, Velocity second)
    {
        return new Velocity(first.value + second.value);
    }

    public static Velocity operator -(Velocity first, Velocity second)
    {
        return new Velocity(first.value - second.value);
    }

    // TODO: Overload == and !=, implement IEquatable<T>, override
    // Equals(object), GetHashCode and ToStrin
}

class Test
{
    static void Main()
    {
        Velocity ms = 0;
        ms = 17.4;
        // The statement below will perform a conversion of 9.8 to Velocity,
        // then call +(Velocity, Velocity)
        ms += 9.8;
    }
}

(作为一个旁注…我看不出它是如何真正代表速度的,因为肯定需要方向和幅度。)

2020-05-19