Здесь лучше использовать универсальное или достаточно интерфейса? - PullRequest
1 голос
/ 03 февраля 2011

Есть ли какие-либо преимущества в использовании первого, основанного на общем методе метода вместо второго, который просто использует интерфейс?

class MyClass
{
    public static void Method<T>(T t) where T:IBar
    {            
    }

    public static void Method(IBar bar)
    {
    }
}

Ответы [ 3 ]

2 голосов
/ 03 февраля 2011

Лично я не вижу никаких преимуществ использования дженериков в данном конкретном случае.

1 голос
/ 03 февраля 2011

В этом случае использование типа интерфейса в качестве ограничения бесполезно.

Но иногда это так, например:

interface IHasId
{
   public int Id { get; }
}

public static IList<int> GetIds<T>(IList<T> items) where T:IHasId
{            
    return items.Select(item => item.Id).ToList();
}

в этом (очень глупом) случае вы получаете преимущество в том, чтоВы можете передать IList<IHasIdImplementation>, в то время как в неуниверсальном случае вам нужно будет передать IList<IHasId>.

0 голосов
/ 03 февраля 2011

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

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

public T Method1<T>(object someobject) where T:IBar;

Второй сценарий - это когда вам нужно использовать параметр типа (а не только интерфейс) внутри метода.

Примером обоих требований является метод GetModelByKey () в классе ViewModelFactory. Этот класс кэширует ViewModels с помощью ViewModelType и KeyType, и результирующий метод выглядит следующим образом:

public ViewModelType GetViewModelByKey<ViewModelType, KeyType>(KeyType key) 
        where ViewModelType : ViewModelBase, new()
    {
        IDictionary dictionary;
        var type = typeof(ViewModelType);
        if (!keyedViewModelDictionaries.TryGetValue(type, out dictionary))
        {
            dictionary = new Dictionary<KeyType, ViewModelType>();
            keyedViewModelDictionaries.Add(type, dictionary);
        }
        var viewModels = (Dictionary<KeyType, ViewModelType>)dictionary;
        ViewModelType vm;
        if (!viewModels.TryGetValue(key, out vm))
        {
            vm = new ViewModelType();
            vm.Initialize(this);
            viewModels.Add(key, vm);
        }
        return vm;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...