2010-12-11 15 views
3

私はの利点が何であるか疑問に思って、私はこの方法代わりに、メソッドのパラメータの一般的な方法を使用して

public static void Initialize<T>() where T : Game; 

を持っているフレームワークを使用していますが、サンプルコードで、あなたはこの

TargetDevice.Initialize<MyGame>(); 

のようなあなたのゲームをintialize初期

public static void Initialize<T>() where T : Game; 
TargetDevice.Initialize<MyGame>(); 

代わりの

のスタイルを使用して

メソッドを初期化する一般的なスタイルには、私が読むことができる名前がありますか?なぜ私は別のスタイルの代わりに1つのスタイルを選択すべきですか?

ありがとうございました。あなたは違いを意味する場合

+4

最初のメソッドに 'Game'を渡す必要はないので、2番目のメソッドに必要なことは奇妙に思えます。 'Type'で十分でしょうか? –

+0

両方のメソッドでMyGameインスタンスがTargetDeviceによって初期化されていることは明らかです。ジェネリックメソッドを使用する利点の1つは、ユーザーがMyGameの実際のインスタンスへの参照を持たないことです。実際のインスタンスを隠すためのジェネリックプログラミングのこのアイデアの背後にあるアイデアですか? – Emil

+0

*インスタンス付き/なし*はジェネリックスとは無関係です。インスタンスの有無にかかわらずジェネリックバージョンを持つことができ、インスタンスの有無にかかわらず非ジェネリックバージョンを持つことができます。それで、 'Type'とジェネリック' T'の間の違いを議論しました。 –

答えて

5

Foo<T>() 

Foo(Type type) 

は、両方のメリットがあります。後者は、リフレクションを使用して型をロードするときにずっと便利です(多分 Game型はプラグインから来ますか?) - ジェネリックとリフレクションは非常に便利です。

一般的なバージョンは、コンパイル時にすべてが分かっていると便利です。コンパイラによって強制される制約などを介して追加の検証を追加することができます。 Comparer<T>.DefaultまたはEqualityComparer<T>.Default(重点:これらは単なる例です)を介して一般的な比較を使用するなど、具体的にはTを使用したい場合にも便利です - 多くの一般的なパターンにアクセスし、適切な場合はボクシングなどを避けます。

あなたの場合、T : Gameのため、ボクシングは問題ではありません(私はGameはクラスであり、インターフェイスではないと仮定しています)。あなたはどちらにでも行くことができます。 List<Game>はほぼより具体的にはList<T>T : Game)のように機能するため、問題は起こりそうにありません。

反射は全く関与している場合は、私は多分両方を提供し、第二の形式を使用したい:

void Foo<T>() where T : Game 
{ 
    Foo(typeof(T)); 
} 
void Foo(Type type) {...} 

ほとんどの一般的な機能がエミュレートすることができます - たとえばActivator.CreateInstance(type)ためnew T()の代わりに - かへのキャストT : ISomeInterfaceの代わりに既知のインターフェイス。あなたは "制約された"オペコードを使用することはありませんが、あなたのケースではとにかく適用されません。

関連する問題