我有一个Bitmap
课程(我不拥有源代码)有一个构造函数。
我已经为文件创建了自己的加密方法,并且在初始化Bitmap时,它可能必须先解密文件才能加载它。我有一个方法可以做到这一点:Bitmap::load_png
。它返回一个Bitmap
对象。
现在,这个项目已经有数百个引用Bitmap.new
,所以我不想要替换每一个(并且有些类继承Bitmap
或检查{ {1}},所以我无法替换所有内容。
出于这个原因,我想编写一些可以正常初始化.is_a?
的东西,或者根据给定的参数数量使用Bitmap
。如果有2,则应使用原始Bitmap::load_png
,否则应使用Bitmap.new
。
我正在努力弄清楚我是如何做到这一点的。我无法在Bitmap::load_png
中返回Bitmap::load_png
的结果,因为忽略了返回值。
我也无法在def initialize
中返回值,因为这也会覆盖继承它的类。
这里有一些参考代码:
def self.new
我真的不知道如何才能做到这一点。我不想花四天时间挖掘我的所有代码来查找对class Bitmap
alias old_init initialize
def initialize(*args)
if args.size == 2
old_init(*args)
# old_init modifies self's data
else
Bitmap::load_png(*args)
# ::load_png returns a new Bitmap object
end
end
end
的引用,并将其替换为Bitmap.new
(这样可行)。
所以我想我想要的是这个Bitmap.get
类的self.replace(value)
方法。但是,我不知道数据存储的内容和位置。我不知道它使用了哪些变量或方法。
答案 0 :(得分:0)
这是一种可能更有效的方法:
class Bitmap
end
module BitmapWrapper
def self.new(*args)
case args.size
when 2
Bitmap.new(*args)
else
Bitmap.load_png(*args)
end
end
end
Object.send(:const_set, :CompiledBitmap, Bitmap)
Object.send(:remove_const, :Bitmap)
Object.send(:const_set, :Bitmap, BitmapWrapper)
这将使用可以介于中间的包装器交换已编译的Bitmap
类。这很脏,但是当你有很多引用Bitmap的代码时应该可以工作。