none
基本クラスの基本クラスの呼び出し RRS feed

  • Frage

  •  

    次の様な事がしたいです.

     

    public class A

    {

    public virtual Hoge

    {

    }

    }

     

     

    public class B : A

    {

    public override Hode

    {

    }

    }

     

    public class C : B

    {

    public override Hode

    {

    // ここでclass AのHogeを呼び出したい

    }

    }

     

     

    base.base.Hoge

    の様な書き方はコンパイルエラーが出ました.

    ((A)this).Hoge

    ではC.Hogeを何度も呼び出してスタックオーバーフロー.

    C#ではどのように書くのが正しいのでしょうか?

     

    追記

    class A, B共に修正せずに実現したいです.

     

    Montag, 12. November 2007 02:06

Antworten

  •  curex24 さんからの引用
    C#ではどのように書くのが正しいのでしょうか?

     

    .NETの中間言語 (CIL) レベルでは,確かにclass AのHogeを非仮想に呼び出すことが可能です.が,C# の base クラスは,直接の派生元にしかアクセスできないので,class A, B共に修正せずにとなるとリフレクションやデリゲートを使うぐらいしか方法を思いつきません.

    C# を開発の中心言語として利用するなら,class A, Bの設計段階である程度工夫しておくことも実際行われるんじゃないかと思います.

     

    ちなみに,"base.base" で Web を検索してみると,同様の事例が出てきます.

    例えばこのエントリ『Calling Virtual Method of a Class Base to Base Class』も "base.base" で検索することで見つかりました.このエントリでは手っ取り早い対応策として C++/CLI を使うことを提案しています.

    C++/CLI では以下のように書けます.

     

    コード ブロック

    public ref class C: public B
    {
    public:
        virtual void Hoge() override
        {
            A::Hoge();
        }
    };

     

    Montag, 12. November 2007 03:41

Alle Antworten

  • 単にAのHogeの内容を別のメソッドにしてそれをAのHogeから呼び出すようにして、それをCのHogeからも呼び出せばよいのではないでしょうか。

    ただBのHogeだけ違うことをしようとする理由がわかりません。同じメソッドのoverride をしている意味がありません。

    Montag, 12. November 2007 02:30
  • 1 つ上の基底クラスに仲介用のメソッドを用意して連鎖的に呼び出し続ければ何階層でもいけそうですよね。

    Montag, 12. November 2007 02:32
  •  curex24 さんからの引用
    C#ではどのように書くのが正しいのでしょうか?

     

    .NETの中間言語 (CIL) レベルでは,確かにclass AのHogeを非仮想に呼び出すことが可能です.が,C# の base クラスは,直接の派生元にしかアクセスできないので,class A, B共に修正せずにとなるとリフレクションやデリゲートを使うぐらいしか方法を思いつきません.

    C# を開発の中心言語として利用するなら,class A, Bの設計段階である程度工夫しておくことも実際行われるんじゃないかと思います.

     

    ちなみに,"base.base" で Web を検索してみると,同様の事例が出てきます.

    例えばこのエントリ『Calling Virtual Method of a Class Base to Base Class』も "base.base" で検索することで見つかりました.このエントリでは手っ取り早い対応策として C++/CLI を使うことを提案しています.

    C++/CLI では以下のように書けます.

     

    コード ブロック

    public ref class C: public B
    {
    public:
        virtual void Hoge() override
        {
            A::Hoge();
        }
    };

     

    Montag, 12. November 2007 03:41
  •  

    ありがとうございました.

    基本と派生を別の所で開発するような大きなプロジェクトだとやっぱりC++/CLIの方が向いているんでしょうね.

    今回は基本クラスの方を修正する方向で対処したいと思います.

    Montag, 12. November 2007 04:02