none
ジェネリックメソッドの継承 RRS feed

  • 質問

  •  C++/CLIで、ジェネリックメソッドを継承したときに、戻り値の型がちがうといってエラーになり、困っています。

    親クラスはジェネリックでないクラスで、子クラスがジェネリックのクラスというケースです。

    例を挙げます。

    public ref class Class
    {
    public:
     generic<typename T>
     virtual T Function(){return T();}
    };

    generic<typename TYPE>
    public ref class SubClass : Class
    {
    public:
     generic<typename T>
     virtual T Function() override{return T();}
    };

    同じ内容の記述をC#で書いてみたら、エラーになりません。
    何がいけないのでしょうか?

    2009年2月26日 2:48

回答

  • Generic Functionsによると
    modifiers (Optional)
    A modifier for the function, such as static. virtual is not allowed since virtual methods may not be generic.
    だそうです。でもコンパイル時に警告は出ませんね。
    コンパイル時に呼び出すべきメンバ関数を確定させてしまうC++と、実行時に(リンク時?!)メタデータを読みながらメソッドを決定するC#の違いということでしょうか。

    • 回答としてマーク sk7474 2009年3月10日 9:03
    2009年2月26日 10:25

すべての返信

  • Generic Functionsによると
    modifiers (Optional)
    A modifier for the function, such as static. virtual is not allowed since virtual methods may not be generic.
    だそうです。でもコンパイル時に警告は出ませんね。
    コンパイル時に呼び出すべきメンバ関数を確定させてしまうC++と、実行時に(リンク時?!)メタデータを読みながらメソッドを決定するC#の違いということでしょうか。

    • 回答としてマーク sk7474 2009年3月10日 9:03
    2009年2月26日 10:25
  • ありがとうございます。

    わざわざ仕様まで調べていただき、本当にありがとうございました。

    しかし、疑問があります。
    通常のクラス継承だったら、ジェネリックメソッドもオーバーライドできると思います。
    先程、確認いたしました。


    エラーが出るのは、ジェネリッククラスで継承して、ジェネリックメソッドをオーバーライドしようとした時です。
    はじめからジェネリックメソッドの継承が不可能と書いてあるのは不可解ですね。


    いずれにしても、本当にありがとうございました。


     

    2009年2月27日 5:34
  • こんにちは。中川俊輔です。

    佐祐理さん、回答ありがとうございます。

    qwa03304さん、フォーラムのご利用ありがとうございます。
    有用な情報と思われたため、佐祐理さんの回答へ回答マークをつけさせていただきました。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年3月10日 9:07
  • ECMA-372 の 31.3.1 には

    Generic functions can be declared abstract, virtual, and override.

    とありますけどね。

    稍丼 / yayadon
    2009年3月10日 13:31
  • yayadon さん の発言:

    ECMA-372 の 31.3.1 には

    Generic functions can be declared abstract, virtual, and override.

    とありますけどね。


    あるんですが、派生クラス(SubClass)にgenericをつけた途端、通りませんね。(理由はよく分かりませんが。。。)

    # SubClassのgeneric<typename TYPE>を外すとコンパイルは通ります。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年3月10日 15:55
    モデレータ