Операторы и наследование

Мой мозг превратился в желе, или у меня есть неуместный опыт , или что-то в этом роде. Я работаю с иерархией классов, которая выглядит примерно так:
enter image description here

Мой класс Money выглядит так:

public abstract class Money
{
    public int Amount { get; set; }

    public static bool operator ==(Money leftSide, Money rightSide)
    {
        // Money can only be equal if it is in the same currency.
        if (leftSide.GetType() != rightSide.GetType()) return false;
        return leftSide.Amount == rightSide.Amount;
    }

    public static bool operator !=(Money leftSide, Money rightSide)
    {
        // If the currencies are different, the amounts are always considered unequal.
        if (leftSide.GetType() != rightSide.GetType()) return true;
        return leftSide.Amount != rightSide.Amount;
    }

    public static Money operator *(Money multiplicand, int multiplier)
    {
        var result = multiplicand * multiplier;
        return result;
    }

    public static Dollar Dollar(int amount)
    {
        return new Dollar(amount);
    }

    public static Franc Franc(int amount)
    {
        return new Franc(amount);
    }
}

Мой доллар оператор * выглядит так:

public static Dollar operator *(Dollar multiplicand, int multiplier)
{
    var result = multiplicand.Amount * multiplier;
    return new Dollar(result);
}

Теперь, если я запускаю этот тестовый код, я получаю переполнение стека (уау!)

{
    Money fiveDollars = Money.Dollar(5);
    Money timesTwo = fiveDollars*2;
}

Я ожидал, что это рекурсивно вызовет оператор подкласса (Dollar) * , который вернет определенный результат поскольку (Dollar * int) определяется нерекурсивно. Поскольку это не работает, альтернативой является то, что я сделал что-то глупое. Почему это не работает? Как правильно добиться такого поведения?

9
задан Tim Long 13 November 2011 в 02:28
поделиться