为Container设计通用数据结构/存储>;(容器)->;项目

本文关键字:gt 项目 容器 存储 Container 数据结构 | 更新日期: 2023-09-27 18:28:25

我在设计一些通用存储时遇到问题。。

基本上我有以下4个对象

托盘盒包裹项目

前三个都是容器,可以包含比它本身更低的任何东西。最初,它是被迫的,托盘里装着盒子,盒子里装着包裹,包裹里装着物品。但现在我想要它,这样可以跳过一些"中间"容器:EG,托盘包含包含物品的包裹(无纸箱)EG2,托盘包含物品(无纸箱或物品)。

目前,我为这些对象中的每一个都有一个数据库表。但是,设计一种跟踪一切的方法变得越来越混乱。

在Code中,我遇到了其他问题,例如打印托盘的内容,最初是:

class Pallet : List<Box> {}
class Box : List<Parcel> {}
class Parcel : List<Item> {}
class Item {}

class Pallet : List<Box>
{
    void Print()
    { 
        foreach (Box b in this)
            foreach (Parcel p in b)
                foreach (Item i in p)
                    //Print
    }
}

但现在我不知道里面会是什么,我不知道该怎么做

我希望有人能给我一些建议,让我设计一个好的数据结构或以一种好的、高效的方式存储所有内容的方法。我可以做一些类似的事情:

class Pallet : List<T>
{
    void Print()
    {
        if (this[0] is Box)
            //do this
        if (this[0] is Parcel)
            //do this, etc
    }
}

但它看起来非常混乱。

我希望你能看到我在努力做什么。

为Container设计通用数据结构/存储>;(容器)->;项目

为什么不能简单地从完全相同的基类派生每个容器?然后你可以有如下的东西:

public abstract class Container
{
    public abstract void Print();
    public List<Container> Contents { get; set; }
}
public class Box : Container
{
    public override void Print() 
    {
        foreach (Container c in Contents)
            Console.WriteLine("I am a {0}", c.ToString());
    }
}

这意味着任何容器都可以包含许多其他容器。当然,你需要实现一些逻辑来控制这一点,你不希望一个盒子包含太多包裹,但一个盒子可以包含另一个盒子,只要它更小。现在你会说"但是Item也必须从COntainer继承才能包含在一个Box中",你是对的,但你仍然可以使用继承和一个简单的小更改:

public interface IContainable { }
public abstract class Container
{
    public virtual void Print() 
    {
        foreach (IContainable c in Contents)
            Console.WriteLine("I am a {0}", c.ToString());
    }
    public List<IContainable> Contents { get; set; }
}
public class Pallet : Container {  }
public class Box : Container, IContainable {  }
public class Item : IContainable { }

使用这种方法意味着Pallet可以包含内容,但不能包含。Item可以包含,但不是容器。

您还可以将所有容器存储在同一个自引用数据库表中——它们不需要分离。每个包含的项都可以有一个foriegn键,返回到作为其容器的同一表中的另一个项。

但现在我想要它,这样一些"中间"容器可以跳过

我会重新考虑的。它看起来很简单,但本质上是在这里创建第二个并行的数据结构。它引入了一组全新的约束条件。

最好的"解决方法"可能是为每个托盘提供一个默认(无名称)盒子等。

在我看来,你走得太远了,实际上让你的设计变得更糟。我建议恢复到您最初对装有箱子的托盘等的限制,但要做一些小的修改。

如果将地块添加到托盘中,请创建一个"伪"框以将其放入,该框的属性指示它是一个"假"实体。

然后你可以保持你现有的、整洁的结构。但也增加了灵活性。