2009-03-31 23 views
5

これはそうです:ジェネリッククラスの静的メソッド?

静的な値で初期化する必要がある汎用ベースクラスがあります。これらの値は、私の一般的なベースクラスがロードされる種類のものとは関係ありません。また、このようにやってクラスを持ちながら

GenericBaseclass.Initialize(AssociatedObject); 

私はこのような何かを行うことができるようにしたい

public class DerivedClass : GenericBaseclass<int> 
{ 
    ... 
} 

は、これを実現する方法はありますか?私は非ジェネリックなベースクラスを作成してそこに静的メソッドを置くことができましたが、私はその "ハック"が好きではありません:)

+0

既に指摘されているように非ジェネリックベースクラスを唯一の方法として扱うのとは別に、単にハックではなく、実際にそれを行う正しい方法であることを付け加えたいと思います。 –

答えて

14

値がジェネリックベースクラスの型と関係がない場合、ジェネリックベースクラスに属している必要はありません。それらは、完全に別のクラス、またはジェネリッククラスの非ジェネリックベースクラスのいずれかでなければなりません。あなたはが本当にがあなたのジェネリックのTごとに異なる静的変数を使用しないように

using System; 

public class GenericType<TFirst, TSecond> 
{ 
    // Never use a public mutable field normally, of course. 
    public static string Foo; 
} 

public class Test 
{  
    static void Main() 
    { 
     // Assign to different combination 
     GenericType<string,int>.Foo = "string,int"; 
     GenericType<int,Guid>.Foo = "int,Guid"; 
     GenericType<int,int>.Foo = "int,int"; 
     GenericType<string,string>.Foo = "string,string"; 


     // Verify that they really are different variables 
     Console.WriteLine(GenericType<string,int>.Foo); 
     Console.WriteLine(GenericType<int,Guid>.Foo); 
     Console.WriteLine(GenericType<int,int>.Foo); 
     Console.WriteLine(GenericType<string,string>.Foo); 

    } 
} 

ですね:静的変数のために、あなたは型引数の組み合わせごとに異なる静的変数を取得することを念頭に置いて

ベアベースクラス - だからジェネリックベースクラス。

+0

"望ましい行動を達成する唯一の方法"のように "ベストプラクティス"または "すべき"のように "しなければならない"か? :) – cwap

+0

異なる型引数が提供されているにもかかわらず、1つの静的変数だけが必要な場合、それは "望ましい動作を達成する唯一の方法"です。 –

+0

明確にしてくれてありがとう..私はそれをしなければならなかった。しかし、完璧な意味合いを持つようになりました:) - 今、ベッドに行ってください。Mr. Know-it-all:P – cwap

6

これはまさにあなたがしなければならないことです。型パラメータがある場合、その型の異なるインスタンス化は、個別の型です。これは、独立した静的変数につながります。

唯一の回避策は、汎用クラスが派生する基本クラスを持つことです。