我正在用C#编写虚拟机的实现,我需要实现VM的堆栈,它可以包含两种类型的条目 - 返回条目或回溯条目。实现这个的最佳方法是什么?
我目前正在使用基本类型,如下所示:
class StackEntry { }
class Return : StackEntry { uint pc; }
class Backtrack : StackEntry { uint pc; object backtrack; }
Stack<StackEntry> stack;
这样可行,但最终的类型测试和向下转换感觉很笨拙。
有没有更好的方法来处理这种类型的建筑?
答案 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
。
您的代码如何以负面方式影响可用性?