C #: динамическое связывание функции, когда шаблон связан с типом - PullRequest
1 голос
/ 03 мая 2011

с учетом класса шаблона, который будет создан только для трех различных типов A, B и C, существует ли способ привязать вызов внешней функции к другому классу на основе типа шаблона, когда шаблон связан с типом?

Например,

class template<T> {
    private printer myPrinter;
    Print(T obj) {myPrinter.Print(obj);
}

class printer {
    public Print(A obj){};
    public Print(B obj){};
    public Print(C obj){};
}

Теперь, насколько я понимаю, выше не сработает.

Что оставляет меня с выбором

1) Написание трех разныхклассы вместо шаблона (имеющие код три раза, а затем статически привязанный к вызову во время компиляции).

2) Изменение дизайна так, чтобы функция печати была включена в объекты A, B и C,и шаблон изменится на

class template<T> where T : IPrintable {
    private printer myPrinter;
    Print(T obj) {obj.Print());
}

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

3) Используя ключевое слово dynamic, что-то вроде этого:

class template<T> {
    private printer myPrinter;
    Print(T obj) {myPrinter.Print((dynamic)obj);
}

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

Итак, то, что я действительно ищу, - это решение, которое сохраняет функции в классе принтера (исключает два), не имеет код многократно (исключает 1) и динамически связывает функцию Print безкаждый вызов, кроме инициализации шаблона (исключает 3).

По сути, я думаю, что как только шаблон будет создан, среда выполнения должна знать, какую функцию вызывать при каждом вызове, и не должна каждый раз выполнять поисквызывается функция.

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

Спасибо

1 Ответ

0 голосов
/ 03 мая 2011

Сделать метод Print в классе printer универсальным методом.

class Printer
{
  public Print<T>(T obj) 
  {
    if(obj is A) DoLogicForTypeA();
    else if (obj is B) DoLogicforTypeB();
    else throw new IllegalArgumentException();
  }
}

Позвоните в шаблоне generic:

Print(T obj) {myPrinter.Print<T>(obj);

Возможно, вы сможете добавить некоторые ограничения where, чтобы он работал лучше.

...