假设我有一类“应用程序”。为了被初始化它在构造函数中需要一定的设置。让我们还假设设置的数量这么多,它的吸引力将它们放在一个自己的类。

比较此方案的以下两种实施方案。

实现1:

class Application 
{
   Application(ApplicationSettings settings) 
   {
       //Do initialisation here
   }
}

class ApplicationSettings 
{
   //Settings related methods and properties here
}

实施2:

class Application 
{
   Application(Application.Settings settings) 
   {
       //Do initialisation here
   }

   class Settings 
   {
      //Settings related methods and properties here
   }
}

要我,第二种方法是非常优选的。它是更具可读性,因为它着重强调了两个类之间的关系。当我写的代码在任何地方实例化应用程序类,第二种方法是将会是什么样漂亮。

现在想象一下设置类本身反过来有一些类似的“相关”类,并反过来该类这样做了。去只有三个这样的水平和类命名失控失控的“非嵌套”的情况。如果你窝,然而,事情仍停留优雅。

尽管如此,我读过的人说,在计算器上,只有当他们没有对外界可见嵌套类是合理的;也就是说,如果它们仅用于内部实现包含类的。常用引异议腹胀含有类的源文件的大小,但局部类是该问题的最佳解决方案。

我的问题是,为什么我们警惕“公开曝光”使用嵌套类的?有没有对这种使用的任何其他参数?

有帮助吗?

解决方案

我觉得这很好。这基本上是建造者模式,并使用嵌套类工作得很好。它也让建设者访问外部类的私有成员,这是非常有用的。举例来说,你可以在其中呼吁对外部类私有构造这需要建设者的一个实例建设者的build方法:

public class Outer
{
    private Outer(Builder builder)
    {
        // Copy stuff
    }

    public class Builder
    {
        public Outer Build()
        {
            return new Outer(this);
        }
    }
}

这确保了建筑外类的一个实例的方法是通过助洗剂。

我在协议缓冲器的我的C#端口使用的图案非常像这样。

其他提示

您可以使用命名空间有关的东西,都...相关。

例如:

namespace Diner
{
    public class Sandwich
    {
        public Sandwich(Filling filling) { }
    }

    public class Filling { }
}

的这种过度使用类如同它们是命名空间的优点是,可以在呼叫一侧向缩写东西任选使用using

using Diner;

...

var sandwich = new Sandwich(new Filling());

如果您使用Sandwich类,仿佛它是为Filling一个命名空间,你必须使用全称Sandwich.FillingFilling

和你打算如何在晚上睡觉知道?

您可能要检查什么微软有说的主题演讲。基本上它的风格我想说的一个问题。

这我有一个有效的利用公共嵌套类的另一个实际的例子是在MVC模式当我使用视图模型与一个IEnumerable属性。例如:

public class OrderViewModel
{
public int OrderId{ get; set; }
public IEnumerable<Product> Products{ get; set; }

public class Product {
public string ProductName{ get; set; }
public decimal ProductPrice{ get; set; }
}

}

我使用它,因为我不想Product类,因为它仅包含其特定视图模型定制重复使用外也。但我不能让它私有,因为产品属性是公共的。

我主要使用微调访问嵌套类嵌套和/或容器类。

有一点要记住的是,一个嵌套类的定义基本上是一个类的成员,并有机会获得全部容器的私有变量。

您也可以使用它来控制特定类的使用。

示例:

public abstract class Outer
{
  protected class Inner
  {
  }
}

现在,在这种情况下,(类)的用户只能访问内部类,如果他实现外。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top