嵌套部分类

21
internal partial class Class1
{
    private class Class2 : ISomething, ISomethingElse
    {
        private class Class3 : ISomething
        {

        }
    }
}

我希望Class3本身可以托管另一个私有的Class4,但这会使Class3太大了,所以我想将Class3设置为部分类。我知道如何将非嵌套类设置为部分类。你如何使嵌套类在单独的文件中成为部分类?


14
如果你需要四层嵌套的类,建议重新考虑你的设计。 - Dan Bryant
1
这可能看起来像是一个糟糕的设计,但如果Class2仅适用于Class1,为什么要将其暴露给所有人呢?Class3和Class4也是如此。我只会暴露那些可能被多个类使用的类,否则我会进行嵌套。 - TrueGrime
2
我仍然看不出四层嵌套的私有类有什么问题。我的意思是,你们都说不要这样做,但我看不出有什么强制性的理由不这样做。我百分之百确定所有嵌套类都不会在它们所属的主类以外的任何地方使用。 - TrueGrime
1
但我也希望将它们从同一程序集或命名空间中的类中隐藏起来。因为如果我可以让事情保持干净和良好的分割,为什么不呢? - TrueGrime
1
这种模式对于生成的类也具有实际价值。一些工具会生成多层嵌套的部分类(例如linq2xsd)。 - Puterdo Borato
显示剩余6条评论
2个回答

26

这篇文章指出,即使嵌套类的父类不是partial类,也可以使嵌套类成为partial类。但是这样你就不能将它们分开放在多个文件中,所以我认为你需要让Class2也成为partial类,并像对待第一层级的类一样进行拆分,保持partial class层次结构。

我真心希望这个问题只是出于好奇。

编辑:我刚试了一下 - 可以正常工作。

file1.cs

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

file2.cs

partial class c1 
{
    partial class c2 
    {
    }
}

所以基本上,即使我将层次结构中的所有类都设置为部分类,除了最顶层的类之外,我仍然无法将它们中的任何一个拆分成单独的文件? - TrueGrime
我可能解释错了。从文章中得知,您可以按照自己的方式拆分代码,只需在要放置Class4的文件中保持层次结构即可。您可以尝试一下看我是否理解正确。 - Dmitry Polyanitsa
如果最顶层的类不是partial,它就不能被分割成多个文件。那么嵌套类如何被分割成多个文件呢?因为它们必须驻留在最顶层的类中。另一方面,如果最顶层的类可以被分割成多个文件,那么嵌套的partial类也可以被分割成多个文件。 - Olivier Jacot-Descombes
Class1类是部分类(在他的问题中),他需要拆分Class3类(因此他将使其成为部分类),而我在我的答案中提到他还需要使Class2类成为部分类。 - Dmitry Polyanitsa

2
如果嵌套类因任何原因需要进行分区,则所有者类也需要进行分区。嵌套类代码也是所有者类代码的一部分 - 它是一种组合关系。
因此,提取嵌套类的一部分也意味着同时提取其所有者的一部分。反过来,我们需要“查看每个部分类的完整路径”,以便编译器可以识别完全指定的类型。
命名空间也是如此 - 与类不同,它们隐式地是部分的,因为我们不希望在同一个文件中拥有整个命名空间,而对于类,特别是嵌套类,我们通常这样做。
因此,通常我们需要在具有嵌套类部分的文件中编写。
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
            {
               // 嵌套类定义的另一部分:
               // MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassA
            }
       }
    }
}

还有另一个文件,其中嵌套类的另一部分被命名为'B':

namespace MyTopNamespace 
{ 
    namespace MyLevel2Namespace 
    {
        partial class MyTopLevelClass
        {
            partial class MyNestedClassB
            {
               // 嵌套类定义的另一部分:
               // MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassB
            }
       }
    }
}

或者我们可以在其他文件中定义两个嵌套类的不同部分等,但我们总是需要完全指定类类型的定义位置


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接