语言最好是C#, C++也行, 只是相信从语法角度来说C++不会比C#强.我在考虑怎样设计很大量的对象的关系, 注意是很大量, 而且have-a关系的层次很深, 10层左右.具体的, 我有个对象A, A对象内有A_A, A_B, A_C...... A_A中有A_A_A, A_A_B..... 以此形成树形结构, 有终点, 但可能很深, 需要达到的实现要求, 主要有几点:1. 在使用的过程中, 要能够用点号. 直接串联下去, 如A . A_A . A_A_B . A_A_B_D . ...... 最后调用相关函数, 如A . A_A . A_A_B . A_A_B_D . GetPrcs().2.这些很大量的对象可能属于20个左右的class,  但即使是同一类的对象, 他们的也可能含有各自独特的方法, 我希望各个对象都有能力扩充自己的函数, 但是不希望出现更多的class, 这点好像很难做到.... 关键是我不希望为每一个有特殊方法的对象定义一个class.3. 源代码的最好能反应出这些对象之间的层次结构性.我考虑到两种方式, 一个是嵌套类,问题是层次太深, 10层嵌套类下去会很恐怖, 还一种就是在统一文件域定义好所有对象, 然后用tree把他们组织起来, 但是这样做使得不同层次的对象在源代码上处于同一域内, 没有很好的表现出层次性.大家各抒己见,

解决方案 »

  1.   


     interface ISpecializedLeaf
        {
            void SpecialFunc();
        }    abstract class Leaf : ISpecializedLeaf
        {        #region ISpecializedLeaf Members        public void SpecialFunc()
            {
                //Implement function 
                //throw new NotImplementedException();
            }        #endregion
        }
    直接继承接口或抽象类来实现你各种不同的Leaves,然后把所有Leaves按照次序组合起来!
      

  2.   

    public Thing getThing(Integer id) {
        return new Beta().getGamma().getDelta().getEpsilon().getOmega().getThing(id);
    }这段代码有很多“味道”,比如:消息链:要得到结果的调用有六层之深。 
    不当的亲密关系:客户必须知道其他类的内部结构才能得到结果。 
    不当的暴露:beta、gamma、delta等等方法允许了不当的暴露关系,才能得到第三个对象 。so,我不觉得这是很好的设计,我宁愿把他们拆散,用namespace去划定,而不是class套class 
      

  3.   

    1。有关代码层次问题,我倾向独立编写,直接使用目录或namespace去划分(使用目录效果也不错,这点的感谢vs,在目录里建文件都是vs会自己帮你完成namespace)2。如果说对象实例(不是class而是实例)需要挂接,我倾向使用一个挂接接口和一个管理类。
    像lz要求的这类树状体系,完全可以这么玩
             1。一个IHierarchicalDataSource接口
             2。一个基于IHierarchicalDataSource和CollectionBase,IEnumerable<T>的管理类
             3。一套便于查找操作层级数据的扩展方法
      

  4.   

    ls的想法与我目前的想法接近, ls的同学能否具体谈下你列举的三点的意义和作用? 比如说1. IHierarchicalDataSource这个接口的意义是什么? 是tree中每个节点都必须实现的接口吗?
    2. CollectionBase,IEnumerable<T>两者都需要? 作用分别是什么呢?
    3. 对于这个层级遍历的方法, 我考虑我目前和将来都只需要做到一点, 就是对于树中每一个节点, 都必须能够快速获取父节点, 所以可能会在节点中直接保存父节点ref, 并且能够获取直接下级的子节点便足够了, 不会出现随机访问树中任意节点的情况请ls的多谈下, 欢迎更多的同学参加谈论, 看有没有更美丽的设计
      

  5.   

    请参见 composite 设计模式interface IContainer
    {
       void someMothed();
    }class Container : IContainer
    {
       private List<IContainer> m_List;
       void someMothed()
       {
          custom code ...
          foreach(IContainer item in m_List)
          {
             item.someMothed();
          }
       }
    }