C # - Проектирование классов с использованием наследования и перегрузки операторов - PullRequest
3 голосов
/ 05 августа 2010

У меня есть два класса, которые представляют особый вид числового значения.Давайте назовем одну «Ценность» и одну «Дробь»;Дробь состоит из числителя и знаменателя типа 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;
    }

Ответы [ 2 ]

1 голос
/ 05 августа 2010

Если ваш базовый класс должен делать такие вещи, как попытка привести к подтипу и проверить, работает ли он, это признак того, что базовый класс не должен реализовывать этот метод. Теоретически, базовый класс не должен знать никаких конкретных дочерних классов.

В предложенной вами реализации, если вы хотите добавить еще один дочерний класс, вам нужно будет отредактировать базовый класс. Весь смысл наследования в том, что вы можете добавлять новые типы без необходимости редактирования существующих объектов.

1 голос
/ 05 августа 2010

На самом деле, я бы увидел самый «элегантный» способ определения каждого варианта в отдельности.

Преимущества:

  • Выбор правильного вычисления выполняется компилятором во время компиляции (где это должно быть сделано), а не во время выполнения.
  • Каждый метод расчета содержит только код расчета.

Недостатки:

  • Это немного больше кода (просто научитесь чертовски печатать)

Итак, давайте посмотрим, у вас есть:

  • Фракция оп фракция
  • Дробная операция Значение
  • Значение op Fraction
  • Значение ОП Значение

умножить на 4 операции, что дает всего 16 методов, которые, вероятно, будут занимать около одной строки каждая.

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