使用隐式实现 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 _ =>
}