用于类或变量方法名称的Scala默认方法

时间:2014-12-03 00:43:08

标签: class scala methods metaprogramming

我正在研究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()方法名称。

1 个答案:

答案 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而不是方法,好处是您可以更好地控制如何处理该方法。如果选择此方法,还要考虑除非允许包装器的内部实例发生更改,否则您可能不需要一直计算方法列表。另外,检查传递的参数是否是正确的类型和编号!