我正在使用这样的几个类:
class MyClassOne {
doSomething(a : A) : B
...
}
class MyClassTwo {
doSomething(a : A) : B
...
}
课程的来源不在我的掌控之中。尽管类具有相同签名的方法,但它们不实现接口。我想定义适用于所有类的方法。
所以我做了一个像这样的特质:
trait MyTrait {
doSomething(a : A) : B
}
并为所有类进行了隐式转换:
implicit class MyClassOneMyTrait(myClassOne : MyClassOne) {
def doSomething(a : A) = myClassOne.doSomething(a)
}
有没有办法利用类中使用的命名约定,并避免显式委托传递给构造函数的对象?更一般地说,使用具有隐式类的Trait是解决此问题的最佳方法吗?
答案 0 :(得分:4)
实际上,scala功能完全适合您的情况。它被称为structural types。
对于结构类型,类型要求由接口结构而不是具体类型表示。内部实现使用反射,因此具有性能意识!
type A = String
type B = String
class MyClassOne {
def doSomething(a: A): B = {
println("1")
"1"
}
}
class MyClassTwo {
def doSomething(a: A): B = {
println("2")
"2"
}
}
type MyClassType = {
def doSomething(a: A): B
}
List[MyClassType](new MyClassOne, new MyClassTwo).foreach(_.doSomething("test"))
List(new MyClassOne, new MyClassTwo).foreach {
case a: MyClassType => a.doSomething("test")
case _ =>
}