人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

よろしくお願いします。

●質問者: aoi
●カテゴリ:コンピュータ
✍キーワード:C# Interface アクセス インスタンス エラー
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● ku__ra__ge
●60ポイント

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

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


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

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

}

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ