在C#中实现多种类型对象的堆栈的最佳方法是什么?

时间:2008-11-04 21:49:24

标签: c# oop

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

我目前正在使用基本类型,如下所示:

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

Stack<StackEntry> stack;

这样可行,但最终的类型测试和向下转换感觉很笨拙。

有没有更好的方法来处理这种类型的建筑?

4 个答案:

答案 0 :(得分:6)

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

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

这有意义吗?

答案 1 :(得分:3)

反正放置BackTrack对象有什么问题,如果没有回溯,它是否为null?您可以添加一个有用的属性,如bool IsBacktrack {get {return _backTrack!= null; }}

回溯是否可以有效为空?如果是,则使用bool标志。

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

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