我有这个类最好的方法,从不同类别
public abstract class Foo {
def execute: Unit = ???
}
public abstract class Bar {
def execute: Unit = ???
}
public class FooFoo extends Foo {
def execute: Unit = ???
}
public class BarBar extends Bar {
def execute: Unit = ???
}
在某些运行常用的功能,我有这样的方法:
def executeSomething(body: => AnyRef) : = Try(body) match ...
而且调用这个样子
x match {
case _: Foo => executeSomething(x.execute)
case _: Bar => executeSomething(x.execute)
}
有没有什么方法可以做到这一点(没有新班级)
val u = executeSomething(x)
?
UPD
对不起,伙计们。这个m.b.真正的代码会更加清晰
import akka.actor.{Actor, ActorLogging, ActorRef, Props}
import com.google.api.client.auth.oauth2.AuthorizationCodeTokenRequest
import com.google.api.client.googleapis.json.GoogleJsonResponseException
import com.google.api.services.analytics.Analytics
import com.google.api.services.analyticsreporting.v4.AnalyticsReporting
import com.my.lab.messages.{GRequest, GResponse}
import scala.util.{Failure, Success, Try}
class GQueueTask(req: GRequest, ref: ActorRef) extends Actor with ActorLogging {
def receive: Receive = {
case _ =>
}
def execute(body: => AnyRef): Unit = {
Try(body) match {
case Success(r) => ref ! GResponse(req, response = Option(r))
case Failure(f: GoogleJsonResponseException) =>
f.printStackTrace()
ref ! GResponse(req, error = Option(f))
case _ => ref ! GResponse(req, Option("unknown error"))
}
}
req match {
case GRequest(request, _) => request match {
case x: AnalyticsReporting#Reports#BatchGet => execute(x.execute()) // AbstractGoogleClientRequest
case x: Analytics#Data#Ga#Get => execute(x.execute()) // AbstractGoogleClientRequest
case x: Analytics#Management#Accounts#List => execute(x.execute()) // AbstractGoogleClientRequest
case x: Analytics#Management#Webproperties#List => execute(x.execute()) // AbstractGoogleClientRequest
case x: Analytics#Management#Profiles#List => execute(x.execute()) // AbstractGoogleClientRequest
case x: AuthorizationCodeTokenRequest => execute(x.execute()) // TokenRequest
case _ => ref ! GResponse(req)
}
}
context stop self
}
我试图简化 “的要求匹配” 块
为什么不能延伸功能,只是调用'VAL U = X()'?用'apply'代替'execute'。 – Bergi
我有一些遗留代码看起来像这样。我只能修改executeSomething及以下:( – HoTicE
码你就不能使用重载executeSomething'高清executeSomething(X:美孚)= x.execute; 高清executeSomething(X:酒吧)?= x.execute' –