В математическом пакете я пытаюсь создать классы для различных типов матриц, таких как типичная прямоугольная матрица, треугольная матрица, диагональная матрица и т. Д. Причина, естественно, заключается в том, чтобы сэкономить на эффективном хранении и эффективной реализации алгоритма для специальных матриц.Но я все же хотел бы иметь гибкость перегруженных операторов, где C = A + B будет принимать A и B как любой тип матрицы и возвращать соответствующий результат (результат может быть понижен до типичной прямоугольной матрицы, если один из операндов является прямоугольным).
Я подумал о 2 возможных идеях, обе из которых беспорядочные:
(1) Интерфейс IMatrix, который бы перечислял все методы, которые должны быть реализованы для каждого типа матрицы.например, транспонировать, инвертировать и т. д., эффективная реализация которых различна для каждого типа матрицы.Здесь есть две проблемы: (a) Перегрузки операторов являются статическими методами, поэтому их нельзя перечислить в интерфейсе или даже в базовом классе, реализующем интерфейс.Перегрузки операторов должны быть записаны в каждом классе отдельно, и я не могу выполнить операцию типа C = A + B (как я упоминал выше), без беспорядочной проверки типов и приведения в клиентском коде, чего я действительно хочу избежать,(b) Я не могу иметь оба операнда в качестве интерфейса, когда я определяю перегрузки операторов: т.е. я не могу делать следующее, скажем, в классе DiagonalMatrix:
public override IMatrix operator +(IMAtrix lhsMatrix, IMatrix rhsMatrix)
{ ... }
(2) Может иметь один класс Matrix с типом матрицыпеременная, хранящаяся в классе (может быть Enum).В зависимости от типа мы можем реализовать структуру данных и алгоритмы.Перегрузка оператора будет работать без проблем.Здесь есть одна проблема: (a) Класс будет огромен с возможным синтаксисом регистра переключателей для проверки типа матрицы перед запуском конкретного алгоритма.Для каждого бинарного оператора у меня должно было бы быть n ^ 2 случая, где n - это номер типа матрицы, который я хочу реализовать.Может также быть кошмаром обслуживания.
Похоже, без детализации перегрузки оператора я мог бы использовать Заводской шаблон или Шаблон посетителя , но не с операционными перегрузками,Как лучше всего решить эту проблему?
Ресурсы, которые я нашел до сих пор:
- Один связанный поток здесь.
- Объяснение аналогичной проблемы , с которой столкнулся разработчик другого пакета C # Numerics.
Исправления:
4/25/2011: добавлено больше ресурсов Iдо сих пор не нашел об этой проблеме.