假设我有课
class Original {
def originalMethod = 1
}
现在,假设我有一个例子
val instance = new Original
现在是否可以做点什么instance
在运行时替换originalMethod
用不同的方法? (假设签名保持不变)
例如,现在,当调用instance.originalMethod
下面的代码将被调用println("test"); 1
EDIT我无法打电话new Original
。我只有一个现有的实例,我必须对其进行修改。
EDIT 2(@Aleksey Izmailov 回答)这是一个很好的解决方案,但并不正是我正在寻找的。我更多地考虑测试 - “正常”编写一个类,而不将函数指定为变量而不是方法
附言。我在尝试模仿 Mockito 间谍时偶然发现了这个问题
似乎您必须恢复到突变,因为您不能拥有新的实例并且行为必须改变。这也许是最简单的选项(REPL):
将函数存储为可变字段:
scala> class Original {
| var originalMethod = () => 1
| }
defined class Original
scala> val obj = new Original
obj: Original = Original@66ac5762
这是一个不需要任何东西的函数,你需要调用apply
or ()
就可以得到结果。
scala> obj.originalMethod
res0: () => Int = <function0>
scala> obj.originalMethod()
res1: Int = 1 ^
将其替换为新函数:
scala> obj.originalMethod = () => 2
obj.originalMethod: () => Int = <function0>
现在你得到了新的行为:
scala> obj.originalMethod()
res2: Int = 2
有趣的是,您不能使用此类的通用版本进行默认实现,因为没有可以使用的默认值,除非您将其更改为Unit
或部分功能。
这是它的通用版本:
scala> class Original[T] {
| var originalMethod: () => T = null
| }
defined class Original
scala> val genImpl = new Original[Int] { originalMethod = () => 111 }
genImpl: Original[Int] = $anon$1@6b04acb2
scala> genImpl.originalMethod()
res8: Int = 111
scala> genImpl.originalMethod = () => 222
genImpl.originalMethod: () => Int = <function0>
scala> genImpl.originalMethod()
res9: Int = 222
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)