公共的嵌套类型

时间:2010-03-10 17:02:39

标签: .net namespaces nested nested-class

我很好奇在涉及.NET中嵌套类型的某些场景时,什么是好的做法。

假设您有一个Wheel类,Wheel类包含Bearing对象。 Bearing对象仅在Wheel中有意义,并且您不希望允许它独立创建,因此将Bearing类嵌套在Wheel对象中是有意义的。但是,假设您有一个场景,您现在需要读取Wheel类之外的Wheel.Bearings属性。现在需要将嵌套的Bearing类设为public。

在这种情况下,最佳选择是什么? 1 - 创建嵌套在Wheel类中的公共Bearing类
2 - 创建一个独立的Bearing类,在其构造函数中获取Wheel对象
3 - 创建Wheel命名空间并在此命名空间内创建一个独立的Bearing类 4 - 别的什么?

更新: 我正在用更多细节更新这个,并反映到目前为止的一些建议。 ClassParent是父类,ClassChild是子类。 ClassChild总是ClassParent的一个孩子,单独存在是没有意义的。问题是ClassChild有一些需要公开暴露的属性,而所有其他属性只能从ClassParent调用。一个例子是ClassChild.Delete函数,它不应该公开公开,因为它只能从ClassParent调用,因为ClassParent需要执行适当的清理和修改。

在审核了这些建议后,我提出的设计对我来说看起来有些不洁,所以我想我会要求输入。我有:

public class Parent
{
  ChildNested childObj

  public DeleteChild()
  {   
      //expose this method publically
      childObj.DeleteChild()
      //other functionality 
  }

  public Child GetChild()
  {
      //expose Child, not ChildNested publically
      return childObj
  }

   private class ChildNested:Child
   {
         public Child()
         {
              Base.Child()
         }
         public DeleteChild()
         {
              Base.Delete()
         }
   }

public abstract class Child
{
 protected Child()
     {
     }
 protected Delete()
     {
     }
     public PublicPropertyToExpose()
     {
     }    
}

4 个答案:

答案 0 :(得分:8)

这里最好的设计是使用Bearing构造函数创建一个公共internal类,并在Wheel类中创建它的实例。

如果Bearing类需要访问Wheel类的私有成员,则可以创建公共Bearingabstract,然后将其作为一个具体的实现{ {1}} private内的嵌套类。

一般来说,you should not make public nested types

答案 1 :(得分:1)

  • 使用私有构造函数
  • 创建一个独立的Bearing类
  • 创建一个工厂类,在给定Wheel类
  • 的情况下实例化Bearing类

答案 2 :(得分:1)

我想独立测试“轴承”,所以我会选择第二个选项。

答案 3 :(得分:1)

轴承可以单独存在,因为它可能足以在世界其他地方使用,在车轮外。

使用轴承聚合车轮,但车轮未定义轴承。轴承非常有用,除轮子外还可以用于其他东西。

您需要一个公共属性作为一个轴承的事实表明它需要是一个公共类,在Wheel之外。

此外,当您重新发明轮子时会发生什么(我们都做...)。也许您使用新的“空气轴承”,例如存在于微型涡轮机中,现在您在Wheel类中有多个轴承类型,其中一些不使用。

我将Bearing放在同一个命名空间中,但不在Wheel类中。我很少发现需要内部课程。通常,匿名类填补了我需要的任何空白。