Написание универсального класса для обработки встроенных типов - PullRequest
2 голосов
/ 03 октября 2008

Не слишком практично, но все же интересно.

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

И здесь я заметил, что просто матрица int не годится, если я иногда хочу использовать ее с десятичной или двойной. Конечно, я мог бы попытаться просто разыграть все, чтобы удвоить, но это не удобный способ.

Продолжаем, предполагая, что у нас может быть набор объектов, которые мы можем добавлять и умножать - почему бы не использовать их в моей матрице?

Итак, после того, как я подумал, что это будет класс Matrix, я столкнулся с тем, что универсальный T не может использоваться, мне нужно, чтобы он поддерживал некоторый интерфейс, который мог бы добавлять и умножать.

И проблема в том, что я мог переопределить операторы в своем классе, но я не мог представить интерфейс, который бы поддерживал операторы. И у меня есть операторы встроенных типов, но по-прежнему нет интерфейса над ними.

Что бы вы сделали в таком случае, если не хотите дублировать тело рабочего класса? Обертки и неявное кастинг мне мало помогли, меня интересует красивое решение.

Спасибо.

Ответы [ 2 ]

5 голосов
/ 03 октября 2008

Для этого вам нужны общие математики. К счастью Я сделал это . Использование было бы аналогично этому «комплексу» (то есть x + iy) пример . Класс Operator теперь является частью MiscUtil .

2 голосов
/ 03 октября 2008

Ну, есть менее технологичный способ сделать это. Вы не можете добавить новый интерфейс для "int" или "double". Но вы можете объявить интерфейс для объекта, который может умножаться и добавлять значения некоторого универсального типа. И тогда вы сможете реализовать интерфейс для всех нужных вам типов:

public interface ICalculator<T>
{

   T Add(T x, T y);
   T Multiply(T x, T y);

}

public class MatrixMultiplier<T>
{

  public MatrixMultiplier(ICalculator<T> calculator) { ... }

}

public class IntCalculator : ICalculator<int>
{

  public int Add(int x, int y)
  {
    return x + y;
  }

  public int Multiply(int x, int y)
  {
    return x * y;
  }

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