BaseUnit> Unit> ContainerUnit
因此,所有Unit类型(包括ContainerUnit)必须具有ContainerUnit的父级.ContainerUnit类型可以包含ContainerUnit类型的子项,也可以只包含Unit类型.
所以你可以买一盒物品,其中一些是物品盒.
我想拥有一个主ContainerUnit,它被视为所有Unit类型的最高级父级.但这会使其Parent属性为null.意思是,我想说"谁是你爸爸?" 任何事情,没有意识到它在层次结构中的位置,但是如果我问(例如,在一个循环中)主容器的父亲是谁,它会得到优雅的处理.
我正在寻找其他人为解决这个问题而采取的方法.我确实搜索了这个,我的查询没有太多运气.
让最外层的"universe"容器为其容器返回null是传统的做法.这具有容易的优点.它的缺点是你不知道你已经超越了宇宙的边缘,直到它为时已晚才能回来.正如你在评论中所说:使用"null"作为标志很弱.
我见过的另外两个解决方案是:
1)Universe对象是它自己的容器.这样做的好处是什么都不是空的; 它的缺点是在走集装箱链时容易进入无限循环,这是不直观的; 宇宙实际上并不包含自己.基本上你使用等号作为旗帜而不是作为旗帜的可空性; 这似乎也很弱.
2)当您请求容器时,Universe对象会抛出异常.这会强制调用者而不是检查null容器,而是检查"你是整个宇宙吗?" 在要求容器之前.也就是说,当你到达顶部时停止,而不是在超出顶部时停止.这实际上是一种很好的解决方案,因为它迫使人们编写防御性代码.除非你知道有一个容器,否则你不能只问一个容器.当然,它要求调用者能够以某种方式识别Universe对象而不检查其父对象.你需要一个"我是整个宇宙吗?" 方法,或与众所周知的单个对象进行比较,或用于识别哪个是最顶层容器的其他机制.
第三种方法是否认问题的前提; 是否有可能构建您的数据类型,以便不需要知道容器,或者知道它的重要性是否最小化?
例如,在编译器中当然我们有很多"容器"链可以走,我们通过让它的包含符号为null(并且它是一个众所周知的单例对象)来表示全局命名空间.但是很多时间我们不需要检查父项是否为null,因为我编写的代码在其上构建抽象:
static IEnumerable<Container> AllContainers(this Thing thing)
{
if (thing == null) yield break;
Container current = thing.Container;
while(current != null)
{
yield return current;
current = current.Container;
}
}
Run Code Online (Sandbox Code Playgroud)
大.现在我有了这个帮助方法,我不需要检查一个东西的Container属性.如果我想知道,"这个东西有没有容器包含这个东西?" 然后我可以说:
var query = from container in oneThing.AllContainers()
where container.Contains(otherThing)
select container;
bool result = query.Any();
Run Code Online (Sandbox Code Playgroud)
使用LINQ的强大功能来移动机制实现细节,例如"我如何确定何时处于顶部?" 进入更高级别的辅助方法.然后在"业务"级别编写逻辑,而不是在"机制"级别.
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |