複数のクラスに静的メソッドを定義し、定義した静的メソッドへポリモルフィックにアクセスしたいと思っています。
しかし、スーパークラスにvirtualメソッドを定義する場合も、interfaceを使用する場合でもコンパイルエラーとなります。
言語仕様ということで納得はしたのですが、皆さんこのような場合にどのような実装をしているのでしょうか。
具体的には、ジェネリッククラスを定義し、初期化の際に渡された型から型固有のパラメータを取得したいと考えています。
場合によっては T のインスタンスを作成しない場合があり、そのときでも型固有のパラメータは参照したいのです。
無視やりだったら、ダミーインスタンスを1個作ってやって、そのインスタンスメソッドにアクセスしても事は足りるのですが・・・
よろしくお願いします。
静的メソッドにポリモルフィックにアクセスすることはできません。
なぜならば静的メソッドはインスタンスではなくクラスから呼び出されるため、「インスタンスの型(クラス)によって呼び出すメソッド内容を変える」という動きは必然的にできないからです。
私には、後半で言っている意味が正しく理解できていないかもしれませんが、以下のようなことがやりたいのでしょうか?
// ジェネリッククラスを定義し、初期化の際に渡された型から型固有のパラメータを取得 var myIntObject = new MyClass<int>(); Console.WriteLine(myIntObject.GetMyParamaer()); var myStringObject = new MyClass<string>(); Console.WriteLine(myStringObject.GetMyParamaer()); // T のインスタンスを作成しないで、型固有のパラメータを参照 Console.WriteLine(MyClass<int>.GetParameterFromType()); Console.WriteLine(MyClass<string>.GetParameterFromType()); // 型固有のパラメータを取得するジェネリッククラス public class MyClass<T> { public string GetMyParamaer() { return MyClass<T>.GetParameterFromType(); } public static string GetParameterFromType() { return (typeof(T) == typeof(string)) ? "string-type-param" : "other-type-param"; } }
わざわざご丁寧にありがとうございます。
説明が足りずにすみません。
「型」によって呼び出すメソッドの内容が変わるのであれば、「型」をパラメータとするジェネリクスで
静的メソッドの内容も変えられるんじゃないかというのが発想でした。
以下、整形された書式で書く方法を知らないので読みづらいかもしれませんが、私の処理イメージです。
ベタ書きなので文法が違っているかもしれません。
interface IBase{
// 型固有のパラメータを返す
static string GetParameterFromType(); //コンパイルエラー
}
class ExpressionA : IBase{
public static string GetParameterFromType(){
return "A";
}
}
class ExpressionB : IBase{
public static string GetParameterFromType(){
return "B";
}
}
// ジェネリッククラスを定義
class Processor<T> where T : IBase, new(){
public void Process(){
// 初期化の際に渡された型から型固有のパラメータを取得
Console.WriteLine(T.GetParameterFromType());
}
}
class MyClient{
Processor<ExpressionA> proc = new Processor<ExpressionA>();
proc.Process(); //この場合は"A"が出力される
}