scala的动态类实现

来源:互联网 发布:软件需求调查问卷 编辑:程序博客网 时间:2024/04/29 18:35

scala 2.10开始支持动态类型,做个类方面使用,动态对象的成员也可以动态调用。

val person = DynamicImpl()

person.name = "zs"

person.name.value

val bird = DynamicImpl()

bird.sing = (x:Any)=>{ 0.until(4).foreach( _ => {
        print("hello ")
        Thread.sleep(1000)
        print("hello ")
        Thread.sleep(1000)
        println("how are you?")
        Thread.sleep(1000)
    } ) }

person.bird = bird
person.bird.sing()

通过元组解决参数个数问题

person.do0 = (x:Unit)=>println("no parameter")
person.do3 = (x:(String,Int,Double))=>println(" 1st para is "+x._1+", 2nd para is "+x._2.toString+", 3rd para is "+x._3.toString)
person.do0(())
person.do3(("abc",1,2.0))

(7月23日修改,定义一个类更清晰)

import scala.language.dynamics    class DynamicImpl[T](val value:T) extends Dynamic {            protected var members : collection.mutable.Map[String,DynamicImpl[Any]] = null      //相当于属性的get      def selectDynamic(memb: String) = {          if(members != null) {            members.get(memb) match {                  case Some(x) => x                case None => null            }          } else {            null        }    }            //类成员的set,属性、方法都用此函数赋值      def updateDynamic[U](memb: String)(arg: U) = {          if(members == null)            members = collection.mutable.Map[String,DynamicImpl[Any]]()          arg match {              case d : DynamicImpl[Any] => members(memb) = d            case _ => members(memb) = new DynamicImpl(arg)        }      }            //方法的invoke      def applyDynamic[U](method: String)(arg: U) = {          if(members != null) {            val func = members(method).value.asInstanceOf[Function1[Any,Any]]            func(arg)          }    }  }  object DynamicImpl {      def apply() = {          new DynamicImpl(().asInstanceOf[Any])     }  }  


0 0