【问题标题】:Nested types that are public公开的嵌套类型
【发布时间】:2011-01-26 00:09:49
【问题描述】:

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

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

在这种情况下,最好的选择是什么?
1 - 创建一个嵌套在 Wheel 类中的公共轴承类
2 - 创建一个独立的轴承类,该类在其构造函数中接受一个 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()
     {
     }    
}

【问题讨论】:

    标签: .net namespaces nested nested-class


    【解决方案1】:

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

    如果Bearing 类需要访问Wheel 类的私有成员,您可以将公共Bearing 类设为abstract,然后具体实现为private 嵌套类在@987654330 内@。

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

    【讨论】:

    • +1。我完全同意。嵌套类型难以阅读,难以理解。当你对它们进行编程时,你总是需要指定输出类型,这很烦人。
    • 但是如果没有轮子轴承永远也不应该存在怎么办?因为在这种情况下,您实际上可以创建一个没有 Wheel 的 Bearing 对象。一个例子是 Keyboard 类和 Key 类,没有键盘就永远不能拥有 keybody 键。
    • 有没有办法创建一个类,它有两个(或多个)从它派生的公共类,但不是“公共”可派生的,除了让基类公开,带有一个私有构造函数,然后将派生类嵌套在其中?在设计类层次结构时,我似乎经常发现自己被困在一个角落里,我想成为公共类的东西被困在其他类中。除了提供比我真正想要的更大的范围之外,还有什么好的方法吗?
    • @super:给基类一个internal构造函数,并密封派生类。
    • 我想这并不可怕,尽管将范围放在它应该的位置需要将类拆分到它自己的程序集中,这似乎是一项相当大的工作;否则这个类的范围会比它真正应该的更大。嵌套类的范围是完美的;唯一的烦恼是外部名称最终过于复杂。
    【解决方案2】:
    • 使用私有构造函数创建一个独立的轴承类
    • 创建一个工厂类,在给定 Wheel 类的情况下实例化 Bearing 类

    【讨论】:

    • 或者在车轮上有一个返回轴承的方法,比如“CreateBearing”。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      Wheel 是使用 Bearings 聚合的,但 Wheel 不定义 Bearing。轴承很有用,除了轮子,还能用在其他东西上。

      Bearing 需要公共属性这一事实表明它需要是 Wheel 之外的公共类。

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-10
        • 2016-04-30
        • 1970-01-01
        • 1970-01-01
        • 2012-08-19
        • 2010-09-25
        • 2017-10-13
        • 2019-08-04
        • 1970-01-01
        相关资源
        最近更新 更多