Перегрузка оператора присваивания в C # - PullRequest
56 голосов
/ 27 декабря 2010

Я знаю, что оператор = не может быть перегружен, но здесь должен быть способ сделать то, что я хочу:

Я просто создаю классы для представления количественных единиц, так как я немного занимаюсь физикой. Очевидно, я не могу просто наследовать от примитива, но я хочу, чтобы мои классы вели себя точно так же, как примитивы - я просто хочу, чтобы они печатались по-разному.

Так что я смогу пойти,

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

и т.д.

Я не уверен, как это сделать. Я решил написать несколько классов вот так:

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

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

Но, очевидно, я не могу перегрузить оператор присваивания. Есть ли способ, которым я могу получить это поведение?

Ответы [ 3 ]

84 голосов
/ 27 декабря 2010

Похоже, вы должны использовать struct , а не класс ... и затем создать оператор неявного преобразования, а также различные операторы для сложения и т. Д.

Вот некоторыепример кода:

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;
    }
}

(В качестве примечания ... Я не понимаю, как это на самом деле представляет скорость, так как для этого нужно направление, а также величина.)

10 голосов
/ 27 декабря 2010

Вы можете создавать неявные операторы преобразования. На MSDN есть страница с хорошим примером.

Это также хорошая идея сделать их неизменными структурами. Это именно то, что представляют собой «примитивы», и это делает невозможным наследование от них. Вы хотите структуру, потому что вы хотите семантику типа значения, а не семантику ссылочного типа. И вы хотите, чтобы они были неизменяемыми, потому что изменяемые типы значений, как правило, плохая идея.

0 голосов
/ 27 декабря 2010

Я думаю, что он не может быть перегружен, потому что все классы C # являются производными от Object, поэтому они в основном являются объектами, и когда вы используете операторы присваивания, вы просто ссылаетесь на другой объект. С другой стороны, если вы используете структуру, тогда вам в основном нужна вся информация, поэтому при использовании оператора = все поля будут скопированы.

Так что я бы сказал, посмотрите правде в глаза и реализуйте функцию с именем Copy (), и у вас все будет хорошо: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...