2009年 06月 05日

クラスメソッドとインスタンスメソッドの定義

どうやら static なんとか、みたいに書いてクラスメソッドをつくる方法はないようだ?

class ModelBase (initarg:Any) {
	// class method
	def create (args: (Symbol, Any)*) = {
		val ret = this.getClass.newInstance.asInstanceOf[ModelBase]

		for ( (key, value) <- args) {
			ret(key) = value
		}

		ret
	}

	// instance method
	def update (key:Symbol, value:Any):Unit = {
		println(key, value)
	}
}

class User (a:Any) extends ModelBase(a) {
	def update_session ():String = {
		"......."
	}
}

object User extends User(null)

val user = User.create('name -> "cho45", 'session_key -> "...")

println(user)
println(user.update_session) //=> type error (user が ModelBase にキャストされてるから……)

object を class とは別に継承して定義して (これ、名前空間が別なんだろうか……) あげるみたいだ。

あと、こういうスーパークラスにインスタンス化をおいだす処理をどう書いたらいいかわからない……

こういうときのための generics か……

class ModelBase [T <: ModelBase[T]] (initarg:Any) {
	// class method
	def create (args: (Symbol, Any)*) = {
		val ret = this.getClass.newInstance.asInstanceOf[T]

		for ( (key, value) <- args) {
			ret(key) = value
		}

		ret
	}

	// instance method

	def update (key:Symbol, value:Any):Unit = {
		println(key, value)
	}
}

class User (a:Any) extends ModelBase[User](a) {
	def update_session ():String = {
		"......."
	}
}

object User extends User(null)

val user = User.create('name -> "cho45", 'session_key -> "...")

println(user)
println(user.update_session)