Типобезопасный способ хранения двух типов объектов в коллекции

Я реализовал улучшенный алгоритм Shunting-Yard для разбора арифметического выражения. Одним из аспектов алгоритма является то, что он поддерживает Очередь и Стек .

В моей реализации очередь содержит Выражения и Операторы . Стек содержит Операторы и Круглые скобки .

Выражения , Круглые скобки и Операторы имеют нет ничего общего, что гарантирует, что у любых двух из них будет общий интерфейс.

Подходы:

  • Моя текущая реализация состоит из Expression и Operator , реализующих INotParanthesis ]. Оператор и Paranthesis реализуют INotExpression . Затем я объявляю Queue и Stack .

    Мне не нравится эта реализация - эти интерфейсы кажутся очень хакерскими для целей более чистого алгоритма код. Я также считаю, что интерфейсы должны описывать, что такое объект, а не то, чем он не является.

  • С другой стороны, я также не хочу использовать коллекции , поскольку может быть трудно быть уверенным в правильности такого кода.

  • Единственное, что я придумал до сих пор, это реализация моих собственных контейнеров NonParanthesisQueue и NonExpressionStack . Это дает преимущество в виде более последовательной проверки типов для объектов, извлекаемых из этих контейнеров, а также недостаток в гораздо большем объеме кода.

  • Есть ли разумные альтернативы моим подходам?

    5
    задан nawfal 3 July 2014 в 18:00
    поделиться