【问题标题】:Nested Partial Class嵌套部分类
【发布时间】:2012-02-26 22:05:42
【问题描述】:
internal partial class Class1
{
    private class Class2 : ISomething, ISomethingElse
    {
        private class Class3 : ISomething
        {

        }
    }
}

我希望Class3 本身托管另一个私人Class4,但这会使Class3 太大,所以我想使Class3 部分。我知道如何对非嵌套类做到这一点。如何将嵌套类部分放在单独的文件中?

【问题讨论】:

  • 如果您需要 4 级嵌套类,您可能希望重新考虑您的设计。
  • 这似乎是一个糟糕的设计,但如果 Class2 只是为 Class1 所需要和设计的,为什么还要向所有人公开呢?这同样适用于 Class3 和 Class4。我只公开可能被超过 1 个类使用的类,否则我会嵌套。
  • 我仍然看不出 4 级嵌套私有类有什么问题。我的意思是你们都说不要这样做,但我看不出一个令人信服的理由为什么不这样做。我知道 100% 的所有嵌套类都不会在它们的宿主类之外的任何其他地方使用。
  • 但我也想将它们隐藏在同一个程序集或命名空间中的类中。因为如果我能为自己保持清洁和良好的划分,为什么不呢?
  • 保持代码简洁,并在易于理解的小块中使自己免于将来的颈部疼痛。

标签: c#


【解决方案1】:

这个article 声明可以创建嵌套类partial,即使它们的父类不是部分的。但是你不能将它们分成几个文件,所以我认为你也需要制作 Class2 partial 并像使用第一级类一样拆分,保持 partial class 层次结构。

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

编辑:刚刚试过 - 工作正常。

file1.cs

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

file2.cs

partial class c1 
{
    partial class c2 
    {
    }
}

【讨论】:

  • 所以基本上即使我将层次结构中的所有类都设为部分,除了最顶层的类之外,我仍然无法将它们中的任何一个拆分为单独的文件?
  • 我可能解释错了。从我得到的文章中,您可以按照您想要的方式拆分,您只需要将层次结构保留在要放置 Class4 的文件中。你可以试试看我是否正确。
  • 如果最顶层的类不是部分的,它不能被溢出到多个文件中。那么如何将嵌套类拆分为多个文件,因为它们必须驻留在最顶层的类中?另一方面,如果最顶层的类可以溢出到多个文件中,那么嵌套的部分类也可以拆分为多个文件。
  • Class1 类是部分的(在他的问题中),Class3 他需要拆分(所以他会使其成为部分),我在回答中提到他也需要使 Class2 部分。
【解决方案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”的文件中定义了如下内容:

命名空间 MyTopNamespace
{
    命名空间 MyLevel2Namespace
    {
        部分类 MyTopLevelClass
        {
            部分类 MyNestedClassA
            {
               // 我们嵌套类的另一部分定义:
               // MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassA
            }
       }
    }
}

在另一个嵌套类的其他部分后缀为“B”的文件中定义了如下内容:

命名空间 MyTopNamespace
{
    命名空间 MyLevel2Namespace
    {
        部分类 MyTopLevelClass
        {
            部分类 MyNestedClassB
            {
               // 我们嵌套类的另一部分定义:
               // MyTopNamespace.MyLevel2Namespace.MyTopLevelClass.MyNestedClassB
            }
       }
    }
}

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

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多