Подклассы (которые включают переопределение, поскольку этот термин обычно используется), как правило, гораздо предпочтительнее, чем «исправление обезьян» (вставка измененных методов в существующие классы или модули), даже когда последние доступны (встроенные типы, что означает те, что реализованы в C, могут защитить себя от исправлений обезьян, и большинство из них делают).
Например, если ваша функциональность основана на патчировании обезьян, то он будет ломаться и останавливать обновления, если в любой момент класс, к которому вы патчите обезьяну, будет обновлен для реализации в C (для скорости или специально для защиты от патчей для обезьян) , Сопровождающие сторонних пакетов ненавидят патчи обезьян, потому что это означает, что они получают фиктивные отчеты об ошибках от незадачливых пользователей, которые (без ведома для них) фактически используют глючный патч обезьяны, который ломает сторонний пакет, где последний (если не сломана мудрый) безупречен. Вы уже отметили возможное снижение производительности.
Концептуально «матрица чисел с неопределенностью» - это понятие, отличное от «матрицы чисел». Подклассы выражают это четко, обезьяна-патчинг пытается скрыть это. Это действительно корень того, что не так с патчами обезьян в целом: скрытый канал, работающий через глобальные, скрытые средства, без ясности и прозрачности. Все многие практические проблемы в некотором смысле вытекают из этой коренной концептуальной проблемы.
Я настоятельно призываю вас отказаться от исправлений обезьян в пользу чистых решений, таких как создание подклассов.