Шаблон проектирования, позволяющий функциям принимать универсальные типы - PullRequest
6 голосов
/ 01 января 2012

У меня есть два класса:

public abstract class Uniform<T>
public class UniformMatrix4 : Uniform<Matrix4>

(Пока .... будет больше, которые реализуют разные типы)

А теперь давайте скажем, что я хочу написать функцию, которая будет принимать любой унифицированный объект ... но я не могу этого сделать, потому что нет класса с именем Uniform, только общий Uniform<T>. Так каков наилучший подход к решению этой проблемы?

  1. Марка Uniform<T> агрегат IUniform
  2. Сделать Uniform<T> продлить Uniform
  3. Сделать все мои функции, принимающие Uniform, тоже общими, чтобы они могли принимать Uniform<T> напрямую?

Ответы [ 3 ]

5 голосов
/ 01 января 2012

Сделайте ваши методы общими, и вы хороши.

Обратите внимание, что у вас всегда есть выбор использования всех аргументов универсального типа в функции, если это необходимо, например:

public void MyMethod<TUniform, T>(TUniform uniform) where TUniform: Uniform<T> {...}

Компилятор обычно выводит аргументы типа самостоятельно, когда у вас есть параметр, так что вызов на самом деле выглядит как обычный вызов метода в исходном коде C #:

UniformMatrix4 uniform;
MyMethod(uniform); // the types of the generic functions are inferred
3 голосов
/ 01 января 2012

По общему признанию запуган, чтобы опубликовать этот ответ, но думаю, что он может быть правильным:

 public static Uniform<dynamic> MyMethod(dynamic myObject) { 
      //do stuff    
      return uniform;
    }

Вот блог Dino Esposito на эту тему:

http://msdn.microsoft.com/en-us/magazine/ff796227.aspx

Ура,

Мэтт

2 голосов
/ 01 января 2012
public void MyMethod<T>(Uniform<T> uniform) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...