【问题标题】:What is the best way of implementing a stack of more than one type of object in C#?在 C# 中实现多个类型对象的堆栈的最佳方法是什么?
【发布时间】:2008-11-04 21:49:23
【问题描述】:

我正在用 C# 编写一个虚拟机的实现,我需要实现 VM 的堆栈,它可以包含两种类型的条目 - 返回条目或回溯条目。实现这一点的最佳方法是什么?

我目前使用的是基类型,如下:

class StackEntry { }
class Return : StackEntry { uint pc; }
class Backtrack : StackEntry { uint pc; object backtrack; }

Stack<StackEntry> stack;

这行得通,但产生的类型测试和向下转换感觉很笨拙。

有没有更好的方法来处理这种类型的构造?

【问题讨论】:

  • 您能否阐明回溯与返回的实现语义,以及它们对堆栈的作用?

标签: c# oop


【解决方案1】:

我很难想象你将如何使用它,但基本答案是你使用单一类型和默认操作进行后期处理

StackEntry { protected virtual void PostPop(); }
Return : StackEntry { protected override void PostPop(); }
Backtrack : StackEntry { protected override void PostPop(); }

这有意义吗?

【讨论】:

  • 请解释或举个具体例子
  • 如果不进一步详细说明 Backtrack 类的回溯成员的范围,恐怕我无法真正给出具体示例。 OP 的问题基本上是这样的:回溯成员代表什么?它是执行上下文吗?
【解决方案2】:

无论如何都将 BackTrack 对象放入其中,如果没有回溯则让它为 null 有什么问题?您可以添加一个有用的属性,例如 bool IsBacktrack { get { return _backTrack != null; } }

回溯可以有效地为空吗?如果是,则为其使用布尔标志。

【讨论】:

    【解决方案3】:

    为什么需要向下投射?如果您的基类公开了抽象或虚拟成员,或者是一个接口,那么您应该没有问题。这个原则是 OOP 的基础。

    如果这对您不起作用,那么您在 myStack[x].GetType() 上进行切换

    【讨论】:

      【解决方案4】:

      这取决于您期望的抽象级别。基类方法非常好。只有当基准测试显示这种方式损失了太多性能时,我才会尝试更深入地研究,也许使用具有显式内存布局的定制结构,其行为类似于 C union

      您的代码如何以负面的方式影响可用性?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-04
        • 2015-09-07
        • 1970-01-01
        • 2010-11-17
        • 2015-11-15
        • 1970-01-01
        • 2011-05-24
        • 2021-10-17
        相关资源
        最近更新 更多