【问题标题】:Nested class written outside of the class嵌套类写在类之外
【发布时间】:2013-06-06 23:48:21
【问题描述】:

我喜欢使用私有嵌套类,但它们总是让人觉得很杂乱。通常我将它们放在自己的#region 中,但我希望它们在位置方面与它们的父类分开,而且我也不真的希望它们在单独的文件中。我决定做的是使他们的父类部分化,然后将子类物理放置在文件中的父类下方。

不幸的是,每个文件似乎也不能有多个部分类定义。

(编辑:事实证明每个文件可以有多个部分;只是表单设计器不喜欢它。)

我真正想做的是(全部在一个文件中):

internal class Parent
{
}

private class Parent.Child1
{
}

private class Parent.Child2
{
}

但似乎我所能做的就是为每个新的子类生成一个新的源文件,或者像这样安排它们:

internal class Parent
{
   private class Child1
   {
   }

   private class Child2
   {
   }
}

有什么方法可以完成我在这里尝试做的事情吗?

【问题讨论】:

  • 多个类可以在同一个文件中(在同一个命名空间中),即使没有嵌套 - 与 Java 不同,没有一个 [public] 类限制。如果你想要 Parent.Child 命名关系,那么它们必须是嵌套的,尽管部分类可能会伪造一些分离 ..

标签: c# nested-class partial-classes


【解决方案1】:

最接近这种类型的封装是使用部分父类:

internal partial class Parent
{
    private Child1 c1Instance = new Child1();
    private Child2 c2Instance = new Child2();
}

internal partial class Parent
{
    private class Child1
    {
    }
}

internal partial class Parent
{
    private class Child2
    {
    }
}

您可以将它们拆分为多个文件,最终结果将是相同的 - Child1Child2 将是 Parent 内部的私有类,在其他地方无法访问。

有时会让人更加困惑,但我认为这是最接近您想要实现的目标。

澄清

一个 C# 源文件可以包含任意数量的命名空间,每个命名空间可以包含任意数量的结构和类。

这是一个有效(但不是很实用)的 C# 源文件:

using System;

namespace FirstNS
{
    public class Class1
    {
    }

    public class Class2
    {
    }

    public partial class Parent1
    {
    }

    public partial class Parent1
    {
        private class Child1
        {
        }

        private class Child2
        {
        }
    }
}

namespace FirstNS.ChildNS
{
    public class Class3
    {
    }
}

编译为您提供以下类:

FirstNS.Class1
FirstNS.Class2
FirstNS.Parent1
FirstNS.Parent1.Child1 (private)
FirstNS.Parent1.Child2 (private)
FirstNS.ChildNS.Class3

如果您有理由这样做,您也可以将上面的每个类定义拆分为多个文件。

【讨论】:

  • 这是我打算做的,但你需要为每个子类创建一个新文件来执行此操作。我正在寻找一种不使用许多文件但也不将它们全部放在一个类定义中的方法。 (我希望我的一个文件包含一堆明确定义的类,即使一个是其他类的父级。)这似乎是不可能的。
  • 您不需要为此使用多个文件来工作@Corey 的解决方案看起来不错,并将全部编译在一个 .cs 文件中
  • @Sahuagin 您可以根据需要将所有内容放在一个文件中,也可以将其拆分到不同的文件中,无论您喜欢什么。您可以在同一个文件、多个类等中定义多个命名空间。当拆分它们有意义时,请执行此操作。当将它们放在一起有意义时,就这样做。
  • @Daniel 好的,这似乎确实有效。看起来只有表单设计器会阻止您在每个文件中拥有多个部分。非常感谢!
  • @DaveCousineau:回应您对混乱的担忧:制作所有单独的文件后,在文本编辑器中打开 .csproj 文件(Microsoft Power Commands 扩展支持在 Visual Studio 中执行此操作)。将<Compile Include="nested.cs" /> 替换为<Compile Include="nested.cs"><DependentUpon>parent.cs</DependentUpon</Compile>。这会将您的私有嵌套类置于层次结构中的父级之下。请注意,Visual Studio 会自动将此技术用于设计器文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多