我正在研究scala中的一个项目,并且想知道是否有某种方法可以定义一些具有相同代码的方法,例如,所有以字母c开头的函数。例如:
class A {
a() {..}
b() {..}
c[a-z]+() {...}
}
var a = new A();
a.click();
a.cook()
在这个例子中,click()和cook()都会调用c [A-Z] +方法
是否可以创建此类功能,或者它是否超出了Scala的功能?
或者,是否有某种方法允许对对象进行所有可能的方法调用,并且有一种“默认”方法
class B {
a() {..}
b() {..}
default() {...}
}
var b = new B();
b.somethingelse();
其中somethingelse()实际上会调用default()但仍然可以访问somethingelse()方法名称。
答案 0 :(得分:1)
我不认为你可以直接在课堂上打电话来实现你的要求。
但是有一个解决方案,虽然包含一些杂乱的代码:你可以有一个参数化的包装器:
class Wrapper[T](val instance: T) {
def call(methodName:String, params: Any*) = ???
}
现在您可以使用您的类实例化它:
val wrapper = Wrapper[A](new A())
wrapper.call("click")
那么"呼叫"做?它通过反射提取实例的所有方法,然后做你认为更有意义的事情(调用默认值,调用所有匹配的,其他的)。
val methodNames = instance.getClass.getMethods.map(_.getName)
缺点是您必须调用wrapper.call而不是方法,好处是您可以更好地控制如何处理该方法。如果选择此方法,还要考虑除非允许包装器的内部实例发生更改,否则您可能不需要一直计算方法列表。另外,检查传递的参数是否是正确的类型和编号!