Мой мозг превратился в желе, или у меня опыт с ума , или что-то в этом роде.Я работаю с иерархией классов, которая выглядит примерно так:
Мой 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);
}
}
Мой доллар operator *
выглядит следующим образом:
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;
}
Я ожидал, что это будет рекурсивно вызывать подкласс(Доллар) operator *
, который вернул бы определенный результат, поскольку (Доллар * int) определяется не рекурсивно.Поскольку это не работает, альтернатива в том, что я сделал что-то глупое.Почему это не работает?Каков был бы правильный способ получить такое поведение?