2

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

我想让每个类尽可能独立和独立,以便它们可以在不同的项目中再次重用。

然而,在这种架构中,经常发生来自上层的类不仅需要访问来自下层的对象,还需要存储它们的元数据,这些元数据对关联的对象是不可见的。这不仅发生在相邻的层上,也发生在彼此远离的层上。我想知道可能的正确方法是什么,因为我担心我现在使用的方法不是最好的方法。

我想到的解决方案是:

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

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

作为一个令人上瘾的信息,我正在用 C++ 编写我的项目,但这不应该与我的问题真正相关。

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

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

此外,我们有 D 类,它包含 C 类的一个实例和 B 类对象的集合。最后一个类需要能够将 B 类的每个实例与 A 类的一个实例关联起来(这些实例是托管的)通过其 C 类的受控实例),反之亦然

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

4

1 回答 1

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 组合的任何数据存储在值中。

希望有帮助。

于 2013-03-29T13:26:47.703 回答