2008-10-03 3 views
2

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

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

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

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

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

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

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

Спасибо.

ответ

5

Для этого вам нужны общие математика. К счастью I have done this. Использование было бы похоже на этот «сложный» (т. Е. X + iy) example. Класс Operator теперь является частью MiscUtil.

+0

Типового ... Я вижу пост, я могу ответить на вашу работу, и вы получили здесь первый;) – 2008-10-03 11:36:47

2

Ну, есть менее технологичный способ сделать именно это. Вы не можете добавить новый интерфейс для «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; 
    } 

} 
Смежные вопросы