私以为使用猴子补丁的条件主要是可以打开类、可以重定义现有函数。
Ruby 可以说是定义一个同名方法覆盖原有,在 C++ 里同一个类下允许多个同名函数存在,运行的时候通过实参判断使用哪一个函数,这么说 C++ 也可以通过猴子补丁的方式实现对自身的修改?
C++ 类有哪个方法是编译时确定好的,没法打开类,对象属于哪个类是 new 对象的代码确定好的,既然 new 的代码在编译时确定了,再载入补丁库也修改不了 (除非搞缓冲区溢出攻击...)
#1 楼 @luikore 所以说重点还是因为打不开类?我还以为 new 函数存在于每一个类之下呢…类似于 init……
Objective-c 里有 categories。
記得 C# 能夠在 String 上自己定義方法(編譯時),算是一部分的猴子補丁。能不能覆蓋同樣參數的方法就沒試過了。
#3 楼 @chareice 所以说不是脚本语言的专利……是语言设计留不留口的问题?我还以为和编译有关…
@lgn21st 我这里看 Faye 好像挂了……
#4 楼 @lulalala string 好像都是单独出去的一个库?
#3 楼 @chareice @lulalala C#, objc, scala 都改变不了其他代码中的调用目标,只能猴子补丁自己的代码
javascript 中对原型对象的静态方法重新定义可以算是猴子补丁吗?
ObjC 也算是动态语言啦(面向对象那部分)
静态链接过来的库里面的方法都可以动态覆盖掉的(如果我没记错的话)
#10 楼 @dorentus 动态链接库和静态链接库的最大差异是在于是不是运行的时候全部写入内存么?