インターフェイスを単に使用する2番目の方法ではなく、最初のジェネリックベースの方法を使用する利点はありますか?ここでジェネリックをよく使うのか、それとも十分なインターフェースですか?
class MyClass
{
public static void Method<T>(T t) where T:IBar
{
}
public static void Method(IBar bar)
{
}
}
インターフェイスを単に使用する2番目の方法ではなく、最初のジェネリックベースの方法を使用する利点はありますか?ここでジェネリックをよく使うのか、それとも十分なインターフェースですか?
class MyClass
{
public static void Method<T>(T t) where T:IBar
{
}
public static void Method(IBar bar)
{
}
}
。
しかし、時には、それは、たとえばです。 :あなたは、あなたがIList<IHasId>
に合格しなければならない非ジェネリック場合にIList<IHasIdImplementation>
しばらくを渡すことができるという利点がある。この(非常に愚かな)場合
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();
}
。
個人的には、この特定のケースではジェネリックスを使用する利点はありません。
メソッド定義でジェネリックを使用する必要があることがわかったシナリオは2つあります。
最初は、戻り値をジェネリック型の値で指定する必要がある場合です。それはのようだときに:
public T Method1<T>(object someobject) where T:IBar;
あなたはメソッド内の型パラメータ(だけでなく、インタフェース)を使用する必要がある場合に、第2のシナリオです。
両方の要件の例は、ViewModelFactoryクラスのGetModelByKey()メソッドです。このクラスはViewModelType及びます。KeyTypeによってのviewmodelsをキャッシュし、そして得られた方法は次のようになります。制約は有用ではないようにインタフェースタイプを有するこの場合
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;
}
インタフェース制約を使用して汎用タイプを使用した例を見ましたが、インタフェースを使用する代わりにジェネリックタイプ制約が優先された理由を理解したかっただけです。 – Freshblood
@Freshblood、多分あなたはそれらの例を参照することができますか?私たちがあなたが見たものを知るのは難しいことです。私たちはあなたが何を見ているかを見て、何を見せてもジェネリックIMHOは必要ありません。 –
制約は型であってはならないということは間違っていますか? – Freshblood