Перегрузка оператора "Установить равным" - PullRequest
2 голосов
/ 30 января 2010

Я читал Business Primitives от CodeBetter.com и возился с этой идеей.

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

Что я имею в виду под этим:

Money myMoney = 100.00m;

Вместо:

Money myMoney = new Money(100.00m);

Я понимаю, как переопределить все операторы для обеспечения функциональности, выполняющей математику и т. Д., Но я не знаю, что нужно переопределить, чтобы разрешить то, что я пытаюсь сделать.

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

В идеале я бы унаследовал Integer / Float / Decimal или все, что требовалось, и переопределил бы при необходимости, однако очевидно, что это не доступно для структур.

Ответы [ 3 ]

7 голосов
/ 30 января 2010

Вы можете предоставить неявный оператор приведения от decimal до Money, например, так:

class Money {
    public decimal Amount { get; set; }
    public Money(decimal amount) {
        Amount = amount;
    }
    public static implicit operator Money(decimal amount) {
        return new Money(amount);
    }
}

Использование:

Money money = 100m;
Console.WriteLine(money.Amount);

Теперь, что происходит здесь, не то, что мы перегружаем оператор присваивания; это невозможно в C #. Вместо этого мы предоставляем оператора, который может неявно приводить decimal к Money, когда это необходимо. Здесь мы пытаемся присвоить десятичный литерал 100m экземпляру типа Money. Затем за кулисами компилятор вызовет неявный оператор приведения, который мы определили, и используем его для присвоения результата приведения к экземпляру money из Money. Если вы хотите понять механизмы этого, прочитайте §7.16.1 и §6.1 спецификации C # 3.0.

Обратите внимание, что типы, которые моделируют деньги, должны быть decimal под капотом, как я показал выше.

0 голосов
/ 30 января 2010

Оператор присваивания не может быть определен в C #, но для этого вида присваивания вы можете перегрузить неявный оператор приведения:

(внутри класса Money)

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

Примечание: Я рекомендую использовать десятичную для точного расчета денег

0 голосов
/ 30 января 2010

Пожалуйста, пройдите, чтобы получить больше ясности по этому поводу. http://www.csharphelp.com/2006/03/c-operator-overloading/

...