2012-02-04 8 views
15
internal partial class Class1 
{ 
    private class Class2 : ISomething, ISomethingElse 
    { 
     private class Class3 : ISomething 
     { 

     } 
    } 
} 

私はClass3自体を別のプライベートClass4をホストしたいと思っていますが、それはClass3を大きすぎるようにして、Class3を部分的にしたいのです。私はそれをネストされていないクラスにする方法を知っています。どのようにして別のファイルに入れ子クラスを部分的にしますか?ネストされた部分クラス

+9

4レベルのネストされたクラスが必要な場合は、デザインを再考することができます。 –

+0

ネストされたクラスは便利ですが(http://stackoverflow.com/questions/1083032/why-would-i-ever-need-to-use-c-sharp-nested-classes)私は親切にも、あなたが造っているところに、ここで。 – summea

+0

はい、リファクタリングしてください - これは良いアイデアのようには聞こえません – BrokenGlass

答えて

19

このarticleは、親クラスが部分的でなくても、ネストされたクラスを部分的にすることができると述べています。しかし、あなたはいくつかのファイルでそれらを分離することはできませんので、私はあなたが部分クラス階層を維持して、あなたも最初のレベルのクラスと同じように分割し、分割する必要があると思います。

私は本当にこの質問が好奇心のためだけであることを願っています。

EDIT:これを試してみました。うまくいきました。

file1.cs

partial class c1 { 
    partial class c2 { 
     class c3 { 
     } 
    } 
} 

file2.cs

partial class c1 { 
    partial class c2 { 
    } 
} 
+0

基本的に、階層のすべてのクラスを部分的にしても、一番上のクラスを除いて、それらのファイルを別々のファイルに分割することはできません。 – TrueGrime

+0

私はおそらくそれを間違って説明した。私が持っている記事からは、あなたが望むように分割することができます。クラス4を配置したいファイルに階層を保持するだけです。あなたはそれを試してみて、それが正しいかどうかを知ることができます。 –

+0

最上位のクラスが部分的でない場合は、サーバーファイルに書き込むことはできません。だから、ネストされたクラスは、最上位のクラスの内部に存在しなければならないので、どのようにサーバーファイルに分割できますか?逆に、一番上のクラスをサーバーファイルに書き込むことができれば、ネストされた部分クラスを複数のファイルに分割することもできます。 –

1

を入れ子になったクラスは、所有者クラスもその後、パーティション何らかの理由であることが必要である場合に区分される必要があります。入れ子にされたクラスコード所有者のクラスコードでもあり、それは構成の関係です。

したがって、ネストされたクラスの一部を抽出することは、同時にその所有者の一部を抽出することを意味します。 コンパイラが完全指定型を識別できるように、それぞれの部分クラスに "フルパスを参照"する必要があります。

これは名前空間と同じです。クラスとは異なり、暗黙のうちに部分的に暗黙的に使用されています。通常はクラス、特にネストされたクラスに対して、同じファイル内に名前空間全体があるとは思われません。

ので、通常私たちは、ネストされたクラスに定義さ

MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassA 
MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassB 

のようなものの一部で、ファイルに記述する必要があります。サフィックス入れ子になったクラスの他の部分との

namespace MyTopNamespace 
{ 
    namespace MyLevel2Namespace 
    { 
     partial class MyTopLevelClass 
     { 
      partial class MyNestedClassA 
      { 
       // Part of definition for our nested class: 
       // MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassA 
      } 
      class MyOtherNestedClassNotPartitioned 
      { 
       ... 
      } 
      partial class MyNestedClassB 
      { 
       // Part of definition for our nested class: 
       // MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassB 
      } 
     } 
    } 
} 

と、別のファイルの「 'は次のように定義されています:

 
namespace MyTopNamespace 
{ 
    namespace MyLevel2Namespace 
    { 
     partial class MyTopLevelClass 
     { 
      partial class MyNestedClassA 
      { 
       // Another part of definition for our nested class: 
       // MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassA 
      } 
     } 
    } 
} 

さらに、ネストされたクラスの他の部分uffixed「B」はのようなものを定義した:

 
namespace MyTopNamespace 
{ 
    namespace MyLevel2Namespace 
    { 
     partial class MyTopLevelClass 
     { 
      partial class MyNestedClassB 
      { 
       // Another part of definition for our nested class: 
       // MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassB 
      } 
     } 
    } 
} 

それともなど定義された両方の入れ子になったクラスの一部と他のファイルを持つことができますが、我々は常に定義されたクラス型である場合、完全に指定する必要があります。

関連する問題