2015-09-22 88 views
2

我使用这样几类避免明确的代表团:使用implicits何时实现特质

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是解决这个问题的最佳方法?

回答

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 _ => 
} 
+0

如果您想要避免反射的性能损失,您的第二选择是什么? – mushroom

+0

@mushroom使用[Adapter](https://en.wikipedia.org/wiki/Adapter_pattern)设计模式。实际上,你原来的方法是实现它的一种方法。 – Aivean

相关问题