存储有关类实例的其他信息的正确方法是什么?

时间:2012-11-26 18:26:00

标签: oop metadata code-organization

我正在开发一个项目,其中每个类通常包含另一个类的实例列表。这在几个层上重复,因此Class1将包含Class2实例的列表,而Class2实例将包含Class3实例的列表,依此类推。

我希望每个班级尽可能独立和独立,以便在不同的项目中重复使用。

但是,在这种体系结构中,通常情况下,来自上层的类不仅需要访问较低层的对象,而且还需要存储它们的元数据,这些元数据对于关联的对象应该是不可见的。这不仅发生在相邻的层上,而且也发生在彼此远离的层。我想知道有什么可能的正确方法,因为我担心我现在使用的那个不是最好的。

我想到的解决方案是:

  • 对于每个类,创建一个存储成瘾所需信息的包装器。这可能是矫枉过正(我们可能只需要存储几个位),我不确定如何将这个概念应用于远程层。
  • 创建一个单独的结构,用于保存元数据,并保留对象实例和元数据结构实例对。再次,不确定如何使用远层。
  • 在较低级别中创建公共成员,他们无法查看/使用这些成员,并且仅供更高级别的类使用。这解决了这个问题,但我认为这是非常糟糕的做法,并且在很大程度上依赖于外部代码,而不是“触摸”元数据。

其他可能的解决方案是什么?

就像上瘾信息一样,我用C ++编写项目代码,但这与我的问题无关。

编辑: 这是一个更好地解释我的意思的例子:

假设我们有A和B类,它们是已完成的和独立的类。然后我们有C类,它是A类实例集合的管理者。为此,它需要存储有关它正在管理的A的每个实例的成瘾信息。

此外,我们有D类,它包含类C的实例和类B中的对象集合。最后一个类需要能够将类B的每个实例与类A的一个实例相关联(它由受控的C类实例管理,,反之亦然

C和D所需的信息将在何处以及如何存储在此示例中?

1 个答案:

答案 0 :(得分:0)

我认为你的一般问题是你想要A的实例和B的实例加上每个的额外元数据。所以让WrappedA和WrappedB类保存对A的引用,并保留您需要的任何元数据。

Public class A
{
}

public class WrappedA
{
     private A _underlyingInstance;
     public WrappedA(A instanceToWrap)
     {
          _underlyingInstance = instanceToWrap;
          SetAdditionalMetaData();
     }

     protected SetAdditionalMetaData()
     {
          //use _underlyingInstance to set meta data
     }
}

然后,而不是让类型A的列表具有包裹类型的列表A.

public class C
{
     private List<WrappedA> _myAs = null;
     public C(A[] rawAs)
     {
          _myAs = new List<WrappedA>();
          foreach(A a in rawAs)
          {
               _myAs.Add(new WrappedA(a);
          }

     }
}

无论您需要添加到包装类中的任何方法,都要执行此操作。如果您需要存储有关AXB的特殊信息,那么似乎Ds对此负责。 D可以创建一个以[A_B]为键的字典,然后在值中存储关于AXB组合的任何数据。

希望有所帮助。