class BaseReturnType { }
class DerivedReturnType : BaseReturnType { }
abstract class BaseClass {
public abstract BaseReturnType PolymorphicMethod();
}
class DerivedClass : BaseClass {
// Error: return type must be 'BaseReturnType' to match
// overridden member 'BaseClass.PolymorphicMethod()'
public override BaseReturnType PolymorphicMethod() {
return new DerivedReturnType();
}
}
это должно работать
Если вы «академически заинтересованы», вы хотите узнать, как написать синтаксический анализатор с приоритетом оператора.
Простой анализ сверху вниз в Python - хорошая статья который создает пример синтаксического анализатора, который делает именно то, что вы хотите: оценивать математические выражения.
Я настоятельно рекомендую попробовать написать свой собственный первый синтаксический анализатор - это один из тех "ах, , который " как это работает "моменты!
Это то, что делает функция eval в Python.
result = eval(expression)
Остерегайтесь, хотя она может делать гораздо больше, в первую очередь вызывать функции, поэтому для безопасности вы должны убедиться, что она не может доступ к местным или глобальным. Кроме того, вы можете получить доступ к встроенным методам, включая хитрый import , поэтому вам также необходимо заблокировать доступ к нему:
result = eval(expression, {'__builtins__': None}, {})
Но это только в том случае, если вам нужна безопасность, то есть если вы разрешаете кому-либо вводить любое выражение.
Конечно, поскольку вы таким образом блокируете использование всех переменных locla, у вас нет никаких переменных для использования, поэтому для этого вам нужно передать только те переменные, которые должны быть доступны в словарях.
vars = {'__builtins__': None, 'x': x}
result = eval(expression, vars, {})
или аналогичный.
Я не очень хорошо знаком с Python и какими-либо чрезвычайно питоническими методами, но вы можете посмотреть на паттерн интерпретатора , который описан в книге «Банда четырех». Он разработан для обработки «языка», а математические выражения подчиняются правилам определенного языка. Фактически, пример в Википедии на самом деле является Java-реализацией калькулятора RPN.
Другая возможность - посмотреть на Pyparsing , который представляет собой общий конструктор парсеров. Он более мощный, чем вам нужно, но его можно реализовать быстрее.