У меня есть два класса, которые представляют особый вид числового значения.Давайте назовем одну «Ценность» и одну «Дробь»;Дробь состоит из числителя и знаменателя типа Value.Поскольку это числовые значения, перегрузка операторов (+ - * /) имеет большой смысл.Учитывая природу стоимости, деление возвращает дробь.Операции могут выполняться с использованием сочетания значений и дробей.
В настоящее время я только что определил неявный оператор приведения от значения к дробному (и явный оператор от дробного к значению, хотя я его не использую)и я не использую какое-либо наследование.
Мне интересно, существует ли какой-либо «элегантный» способ определения как в терминах абстрактного базового класса, который определяет набор доступных операций, так и вызовасоответствующая операция.Эффективность является проблемой.Я бы предпочел использовать Fraction только тогда, когда это необходимо, и не хотел бы определять более сложные операции для обоих случаев отдельно, когда они могут быть выражены с использованием одного и того же синтаксиса.после каждой операции, но мне интересно, есть ли лучшие способы сделать это?
public static AbstractValue operator *(AbstractValue a, AbstractValue b)
{
Value valA = a as Value;
Value valB = b as Value;
if(valA == null)
{
Fraction fractA = a as Fraction;
if(valB == null)
{
Fraction fractB = b as Fraction;
return fractA * fractB;
}
return fractA * valB;
}
if(valB == null)
{
Fraction fractB = b as Fraction;
return valA * fractB;
}
return valA * valB;
}