使用隐式实现 Trait 时避免显式委托
Avoiding explicit delegation when using implicits to implement a Trait
我正在使用几个这样的类:
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)
}
有没有办法利用 类 中使用的命名约定并避免显式委托给传递给构造函数的对象?更一般地说,使用具有隐式 类 的特征是解决此问题的最佳方法吗?
实际上,有一个 scala 功能正好适合您的情况。它被称为 structural types。
For structural types type requirements are expressed by interface structure instead of a concrete type. Internal implementation uses reflection, so be performance-aware!
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 _ =>
}
我正在使用几个这样的类:
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)
}
有没有办法利用 类 中使用的命名约定并避免显式委托给传递给构造函数的对象?更一般地说,使用具有隐式 类 的特征是解决此问题的最佳方法吗?
实际上,有一个 scala 功能正好适合您的情况。它被称为 structural types。
For structural types type requirements are expressed by interface structure instead of a concrete type. Internal implementation uses reflection, so be performance-aware!
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 _ =>
}