2017-05-25 15 views
-1

今日の仕事でコードベースの中で何かを見ている間、私は次のコードに出くわしました。そして、私はそのようなことがどのように機能するか把握できません。誰かが私にこれをどうやって説明することができますか?入れ子クラスはコンテナクラスからどのように継承されますか?

class Outer { 
    void MethodOne(); // Non-virtual 
    // more non-virtual methods 
    public class InnerFoo : Outer { // HOW is this possible? 
     void InnerMethodOne(); 
     // more methods on the derived class 
    } 
    public class InnerBar : Outer { // o_O 
     // stuff 
    } 
} 

このようなクラス構造を解釈するのではなく、コンパイラがこれをどのように解析するかはわかりません。

+0

でも、それはベストプラクティスではないかもしれませんし、ほとんど意味がありません。 –

+2

あなたの質問にどう答えればいいのか分かりません。どうしてできないのですか? – Rob

答えて

1

コンパイラの観点からは、これはかなり簡単です。コンパイラは、Outerを継承する2つのクラスのMSILを出力します。 の名前空間外にあるInnerBarまたはInnerFooを参照しようとするコードでは、コンパイルエラーが発生します。出力バイトコードの点で

、このコードは、次の

class Outer { 
    void MethodOne(); 
    // more non-virtual methods 
} 

class InnerFoo : Outer { 
    void InnerMethodOne(); 
    // more methods on the derived class 
} 

class InnerBar : Outer { 
    // stuff 
} 

と同じであることを覚えているために、関連するポイントは、コンパイラに、クラスが入れ子になっているかどうかだけのクラスであるかどうかということです。ネストされたクラスと通常のクラスとの唯一の違いは、コンパイラが他のクラスがそのクラスを参照することを許可する方法です。

+0

ああ、ありがとう。私はネストされたクラスを使用していません(本当の理由も決して見られません)ので、コンパイラがそれらをどのように扱ったかはわかりませんでした。 –

+0

これは非常に貴重な時間です。これらは、カプセル化を保持するため、またはさまざまなユーティリティクラスを使用してAPI名前空間を汚染しないようにする必要がある場合に非常に役立ちます。 – s3raph86

関連する問題