Поскольку мышление большинства разработчиков языков слишком статично.
Хотя такие функции опасны для программистов, они являются необходимыми инструментами для разработчиков библиотек. Например, в Java можно создавать объекты без вызова конструктора (да, вы можете!), Но эта возможность предоставляется только разработчикам библиотек. Тем не менее, многие функции, за которые разработчики библиотек убили бы, увы, невозможны в Java. C #, с другой стороны, добавляет все больше и больше динамических функций в каждой версии. Я действительно с нетерпением жду всех потрясающих библиотек, которые можно создать с помощью предстоящего DLR (динамического языка исполнения).
В некоторых динамических языках, таких как Smalltalk (а также, насколько мне известно, Perl и Python, но не Ruby), полностью возможно изменить класс объекта. В Pharo Smalltalk вы достигаете этого с
object primitiveChangeClassTo: anotherObject
, который изменяет класс object
на anotherObject
. Обратите внимание, что это не то же самое, что object become: anotherObject
, который обменивает все указатели обоих объектов.