【问题标题】:public inner classes公共内部类
【发布时间】:2010-08-11 14:10:11
【问题描述】:

谁能解释一下,为什么我们可以做这样的事情以及为什么我们需要这个

public class OuterClass
{
  public class InnerClass 
  {
  }
}

为什么我们需要公共内部:结构、类、枚举或静态类?

我认为如果它是内部的,那么它必须是私有的或受保护的。

【问题讨论】:

  • 你为什么认为“如果它是内部的,那么它一定是私有的或受保护的”?
  • 我的意思是这对我来说是合乎逻辑的,但正如人们所说,有时我们需要这样的功能

标签: c# java .net


【解决方案1】:

您通常需要公共嵌套类型 - 但它们有时会很有用。它们非常清楚地表明一种类型与另一种类型显式关联。

它们允许嵌套类型访问封闭类型的私有成员(在 C# 中),这有时可能很有用。例如,我List<T>.Enumerator 可能会这样做。在 Java 中,访问规则是相反的——封闭类可以访问嵌套类的私有成员。

我认为必须解释为什么您要明确禁止这个,而不是为什么需要它。除了不一致(例如,声明具有内部返回类型的公共方法)之外,我想不出您可以指定访问修饰符但不能将其公开的其他任何地方。

【讨论】:

  • 你摇滚,乔恩!真的,很棒的解释
  • 谢谢你的回答,现在我很清楚了。我之所以问这个问题,是因为我看到我们的初级开发人员如何将枚举嵌套,然后将它用作类方法的参数。所以这对我来说看起来很奇怪,因为我之前从未见过这样的代码。外部类 obj = 新的外部类(); obj.Method(OuterClass.InnerEnum.Value1);
  • “看起来很奇怪”并不是禁止某事的理由 ;-)
  • 是的,我知道 :) 我想不出任何需要它的情况,所以我试图找到一些解释为什么根本需要它但没有找到,所以我问这个问题在这里,并找到了答案! :) 但我仍然认为,在我展示的情况下,这很奇怪 :) 我曾经以微软在 .net 框架中的方式编写(我是 c# 开发人员),但我不记得他们在哪里以这种方式使用枚举。即使它只在一个类中使用。
  • 今天我偶然发现.NET在哪里使用这样的枚举:)我正在寻找如何通过Environment类获取程序文件目录并找到这样的方法Environment.GetFolderPath它使用SpecialFolder枚举(在Environment class :) ) 作为参数,所以我的代码看起来像这样 Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
【解决方案2】:

公共内部类型一般不推荐,见这个参考 http://msdn.microsoft.com/en-us/library/tdz1bea9(v=VS.71).aspx

...但是由于有(可能)例外,这仍然是允许的

【讨论】:

  • 这些是 Microsoft 的类库指南(即在扩展 .Net 框架方面)。大多数规则可以而且应该应用于自定义项目。这是我不认为这是特殊情况的少数情况之一。
【解决方案3】:

考虑这个例子:

public class TrainingFile {

    public List<TrainingFileEntry> getEntries() {
           return ...
    }

    public class TrainingFileEntry {
        int x;
        int y;
   }
}

您想隐藏 TrainingFileEntry 的详细信息,但您的客户需要能够使用它。 Ofc 你可以为这个嵌套类创建一个自己的文件,但是这样一个嵌套的帮助类大多不是“独立的”,并且坚持它嵌套的类。 -)

【讨论】:

  • +1 - 我在 WPF 控件中使用了很多类似的东西,这些控件可能有内部类作为视图部分(列表条目等)......保持实际的命名空间更干净。
【解决方案4】:

当 InnerClass 的每个成员确实属于一个,并且只属于外部类的一个成员时,它非常有用。我使用了这个结构,其中 OuterClass 是数学对象的集合,而 InnerClass 是实际的对象本身。

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 2011-09-06
    • 2013-09-11
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    相关资源
    最近更新 更多