C#に詳しい方、ご教授ください。


複数のクラスに静的メソッドを定義し、定義した静的メソッドへポリモルフィックにアクセスしたいと思っています。
しかし、スーパークラスにvirtualメソッドを定義する場合も、interfaceを使用する場合でもコンパイルエラーとなります。
言語仕様ということで納得はしたのですが、皆さんこのような場合にどのような実装をしているのでしょうか。

具体的には、ジェネリッククラスを定義し、初期化の際に渡された型から型固有のパラメータを取得したいと考えています。
場合によっては T のインスタンスを作成しない場合があり、そのときでも型固有のパラメータは参照したいのです。
無視やりだったら、ダミーインスタンスを1個作ってやって、そのインスタンスメソッドにアクセスしても事は足りるのですが・・・

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/10/31 17:26:05
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:ku__ra__ge No.1

回答回数118ベストアンサー獲得回数40

ポイント60pt

静的メソッドにポリモルフィックにアクセスすることはできません。

なぜならば静的メソッドはインスタンスではなくクラスから呼び出されるため、「インスタンスの型(クラス)によって呼び出すメソッド内容を変える」という動きは必然的にできないからです。


私には、後半で言っている意味が正しく理解できていないかもしれませんが、以下のようなことがやりたいのでしょうか?

// ジェネリッククラスを定義し、初期化の際に渡された型から型固有のパラメータを取得
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";
    }
}
id:atcsugi

わざわざご丁寧にありがとうございます。

説明が足りずにすみません。

「型」によって呼び出すメソッドの内容が変わるのであれば、「型」をパラメータとするジェネリクスで

静的メソッドの内容も変えられるんじゃないかというのが発想でした。

以下、整形された書式で書く方法を知らないので読みづらいかもしれませんが、私の処理イメージです。

ベタ書きなので文法が違っているかもしれません。


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"が出力される

}

2010/10/28 07:10:48

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません