Советы » Переопределение базовых функций в Dart
Переопределение базовых функций в Dart
Иногда возникает необходимость использовать имена функций базовой библиотеки в качестве названий методов собственных классов, например, MyClass.print(). Но в некоторых случаях, внутри таких методов необходимо обращаться к одноименным базовым функциям, как показано в следующем пример:
class LoggerConsoleAdapter {
print(String message) {
// здесь необходимо вызвать глобальную функцию print
print(message.toLowerCase());
}
}
void main() {
LoggerConsoleAdapter log = new LoggerConsoleAdapter ();
log.print("test");
}
Но, выполнение такого кода не приведет нас к желаемому результату, и во время выполнения мы получим ошибку "Maximum call stack size exceeded". Это случится потому, что компилятор начнет рекурсивно вызывать LoggerConsoleAdapter.print до тех пор пока не переполнится стек.
Для решения данной проблемы, необходимо заменить вызов глобальной функции print
внутри нашего метода LoggerConsoleAdapter.print
, на вызов функции с каким-нибудь другим именем, например:
// определим "синонимы" для глобальной функции print
Function coreFunctionPrintV1;
coreFunctionPrintV2(m) => print(m);
class LoggerConsoleAdapter {
print(String message) {
// теперь не возникает рекурсивного вызова метода, а вызывается глобальная функция print
coreFunctionPrintV2(message);
coreFunctionPrintV1(message);
}
}
void main() {
// определим именованную функцию coreFunctionPrintV1
coreFunctionPrintV1 = print;
LoggerConsoleAdapter log = new LoggerConsoleAdapter();
log.print("test");
}