How to mix-in a trait to instance?

前端 未结 5 1406
日久生厌
日久生厌 2020-12-04 12:04

Given a trait MyTrait:

trait MyTrait {
  def doSomething = println(\"boo\")
}

it can be mixed into a class with extends<

5条回答
  •  醉话见心
    2020-12-04 12:36

    I usually used a implicit to mix in a new method to an existing object.

    See, if I have some code as below:

    final class Test {
      def f = "Just a Test"
      ...some other method
    }
    trait MyTrait {
      def doSomething = {
        println("boo")
      }
    }
    object HelperObject {
      implicit def innerObj(o:MixTest) = o.obj
    
      def mixWith(o:Test) = new MixTest(o)
      final class MixTest private[HelperObject](obj:Test) extends MyTrait
    }
    

    and then you can use MyTrait method with an already existing object Test.

    val a = new Test
    import HelperObject._
    val b = HelperObject.mixWith(a)
    println(b.f)
    b.doSomething
    

    in your example, you can use like this:

    import HelperObject._
    val o = mixWith(DBHelper.loadMyEntityFromDB(primaryKey));
    o.doSomething
    

    I am thinking out a prefect syntax to define this HelperObject:

    trait MyTrait {
      ..some method
    }
    object MyTrait {
      implicit def innerObj(o:MixTest) = o.obj
    
      def ::(o:Test) = new MixTest(o)
      final class MixTest private[MyTrait](obj:Test) extends MyTrait
    }
    //then you can use it
    val a = new Test
    val b = a :: MyTrait
    b.doSomething
    b.f
    // for your example
    val o = DBHelper.loadMyEntityFromDB(primaryKey) :: MyTrait
    o.doSomething
    

提交回复
热议问题