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

     } 
    } 
} 

我想让Class3本身托管另一个私人Class4,但这会使Class3太大,所以我想使Class3部分。我知道如何去做一个非嵌套类。你将如何在一个单独的文件中创建一个嵌套的类部分?嵌套的部分类

+9

如果您需要4级嵌套类,您可能希望重新考虑您的设计。 – 2012-02-04 18:02:24

+0

虽然嵌套类可能是有用的(http://stackoverflow.com/questions/1083032/why-would-i-ever-need-to-use-c-sharp-nested-classes)我仍然恳请建议考虑另一种方法无论你在建什么,在这里。 – summea 2012-02-04 18:02:37

+0

是的,请重构 - 这听起来似乎不是一个好主意 – BrokenGlass 2012-02-04 18:03:24

回答

19

这个article指出,即使父类不是部分的,也可以使嵌套类为部分。但是,那么你不能将它们分成几个文件,所以我认为你需要使Class2部分化,就像使用一级类一样,保持部分类层次结构。

我真的希望这个问题只是因为好奇。

编辑:只是尝试过 - 工作正常。

file1.cs

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

file2.cs

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

因此,基本上即使我使层次结构中的所有类都不完整,我仍然无法将它们中的任何一个拆分为除最顶层类之外的单独文件? – TrueGrime 2012-02-04 18:17:07

+0

我可能解释错了。从文章中我可以看出,您可以按照自己想要的方式拆分,只需要将层次结构保留在要放入Class4的文件中。你可以试试看看我是否正确。 – 2012-02-04 18:27:21

+0

如果最上面的类不是部分的,它不能被分散到多个文件中。那么如何将嵌套类分割成多个文件,因为它们必须位于最顶级的类中?另一方面,如果最顶级的类可以分散到多个文件中,那么嵌套的部分类也可以分成几个文件。 – 2012-02-04 18:29:24

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 
      } 
     } 
    } 
} 

,并与嵌套类的其他部分其他文件后缀“A '定义类似于:

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

并在与另一部分嵌套类s的另一个文件uffixed“B”定义是这样的:

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

或者我们可以有定义等两个嵌套类的部分其他文件,但我们总是需要充分指定为定义类类型。