2014-12-03 65 views
0

我正在scala中的项目工作,并想知道是否有某种方式,我可以定义一些方法,将具有相同的代码,例如,所有功能以字母c开头。例如:斯卡拉类或可变方法名称的默认方法

class A { 
    a() {..} 
    b() {..} 
    c[a-z]+() {...} 
} 
var a = new A(); 
a.click(); 
a.cook() 

在这个例子中,点击(),煮()将两个调用C [A-Z] +方法

有没有可能创造这样的功能或者是外面Scala的能力?

另外,有一些办法可以让所有可能的方法调用的对象上,并有一种“默认”的方法

class B { 
    a() {..} 
    b() {..} 
    default() {...} 
} 
var b = new B(); 
b.somethingelse(); 

其中somethingelse()实际上会调用默认的(),但仍然可以访问到somethingelse()方法名称。

+4

你可以看看[动态] [1],看看它是否有帮助。 [1]:http://stackoverflow.com/questions/15799811/how-does-type-dynamic-work-and-how-to-use-it – Eduardo 2014-12-03 00:57:27

+0

这绝对是真棒,可以种为我的情况工作,但唯一的问题是,我希望能够在子类中调用随机方法,并让父类处理它们。动态似乎适用于某个类的实例,但如果您只是处理子类化,那么效果并不好。 – 2014-12-03 02:47:20

回答

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,好处是,你有什么与方法做了很多更多的控制。如果你选择这种方法,除非你允许包装器的内部实例改变,否则你也可能不需要一直计算方法列表。另外,请检查传递的参数是正确的类型和编号!

+0

有趣的方法,我会尝试一下!谢谢! – 2014-12-03 15:36:17