Каков наилучший способ реализации стека из нескольких типов объектов в C #? - PullRequest
2 голосов
/ 05 ноября 2008

Я пишу реализацию виртуальной машины на C #, и мне нужно реализовать стек виртуальной машины, который может содержать два типа записей - записи возврата или записи возврата. Каков наилучший способ реализации этого?

В настоящее время я использую базовый тип, как показано ниже:

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

Stack<StackEntry> stack;

Это работает нормально, но результирующее типовое тестирование и уныние кажутся неуклюжими.

Есть ли лучший способ обработки этого типа конструкции?

Ответы [ 4 ]

6 голосов
/ 05 ноября 2008

Я с трудом представляю, как вы собираетесь это использовать, но основной ответ заключается в том, что вы используете один тип с операцией по умолчанию для обработки после всплывающего сообщения

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

Имеет ли это смысл?

3 голосов
/ 05 ноября 2008

Что плохого в том, чтобы поместить объект BackTrack в любом случае, и будет ли он нулевым, если обратного трека нет? Вы можете добавить полезное свойство, такое как bool IsBacktrack {get {return _backTrack! = Null; }}

Может ли возвратный путь быть действительно нулевым? Если да, то используйте для этого флаг bool.

2 голосов
/ 05 ноября 2008

Зачем вам нужно бросать? Если ваш базовый класс предоставляет абстрактные или виртуальные члены или вместо этого является интерфейсом, у вас не должно возникнуть проблем. Этот принцип является основой ООП.

Если у вас это не сработает, переключите myStack [x] .GetType ()

0 голосов
/ 05 ноября 2008

Это зависит от того уровня абстракции, который вы ожидаете. Метод базового класса довольно хорош. Только когда тесты показывают, что таким образом теряется слишком много производительности, я бы попытался углубиться в детали, возможно, используя специально разработанную структуру с явным макетом памяти, который действует подобно C union.

Как ваш код отрицательно влияет на удобство использования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...