0

次の抽象クラスがあります。

abstract class Accessor {

  def get(rowkey:String): Option[M2mModel]
  def insertNew(model: M2mModel): Option[M2mModel]


}

abstract class Model(active:Int) {

  @BeanProperty
  var ttl = None

}

私の実装クラスは次のとおりです。

object AccountModel {
  val COL_USERNAME = "username"
  val COL_EMAIL = "email"
  val COL_PASSWORD = "password"
  val COL_DOMAIN = "domain"
  val COL_ACTIVE = "active"
  val COL_ROLE = "role"
  val COL_ACLID = "aclid"

  val definedFields = List(COL_USERNAME, COL_EMAIL, COL_PASSWORD, COL_DOMAIN, 
    COL_ACTIVE, COL_ROLE, COL_ACLID)

  def apply(rowkey:String, email:String, password:String) = new AccountModel(rowkey, email, password) 

}


case class AccountModel(rowkey: String, email:String, password: Option[String], 
  username: Option[String], domain: Option[String],
  role: Option[String], active: Int, aclid: Option[String]) extends M2mModel(active) {

  def this(rowkey:String, email:String, password:String) = this(rowkey, email, Some(password),
      None, None, None, 1, None)

}

アクセサー クラスを作成し、insertNew メソッドを実装すると、次のエラーが発生します。オブジェクトの作成は不可能です。タイプ (モデル: package.Model)Option[package.Model] のクラス アクセサーのメソッド insertNew が定義されていないためです (package.Model に注意してください)。モデルが package.AccountModel と一致しません)

これが私の実装クラスです

object AccountAccess extends Accessor {
 def insertNew(model: AccountModel): Option[AccountModel] = {

    ...do stuff
}

私は何を間違っていますか?

ありがとう

4

2 に答える 2

1

ここでの問題は、insertNewメソッドが M2mModel 型の何かを必要とし、同じ署名に解決されるメソッドによってのみ実装できることです。

Scala では、これを 2 つの方法で解決できます。

型のパラメータ化

アクセサーは、M2mModel を拡張する T 型の何かで動作するジェネリック クラスと見なすことができます。

abstract class Accessor[T <: M2mModel] {
    def get(rowkey:String): Option[T]
    def insertNew(model: T): Option[T]
}

AccountAccessそして、これから次のように拡張します。

object AccountAccess extends Accessor[AccountModel] {
    def insertNew(model: AccountModel): Option[AccountModel] = {
        ???
    }

    def get(rowkey: String) = ???
}

抽象型メンバー

を拡張Accessorする抽象型のオブジェクトを実装で処理するクラスであると考えることができます。TM2mModel

abstract class Accessor {

    type T <: M2mModel

    def get(rowkey:String): Option[T]
    def insertNew(model: T): Option[T]

}

クラスの拡張 (この場合は ) は、この型がAccountAccessどうあるべきかを指定する必要があります。T

object AccountAccess extends Accessor {

    type T = AccountModel

    def get(rowkey: String) = ???

    def insertNew(model: AccountModel) = ???
}

個人的には、2 番目の選択肢がより良いアプローチであると確信しています。

これに関する非常に興味深い議論をここで見つけることができます:

Scala: 抽象型 vs ジェネリック

将来、この種の問題を非常にエレガントでモジュール化された方法で解決するのに役立つので、読んでください。

于 2012-11-28T22:33:47.733 に答える
0

オブジェクト内のinsertNewの範囲を狭めているため、要件を満たしていないと思います。insertNewメソッドは、より大きく、より小さくM2mModelないクラスのみを取ることができます。

これは機能するはずです:

 def insertNew(model: M2mModel): Option[M2mModel]

この:

 def insertNew(model: Any): Option[Any]

このオブジェクトを、AccountModelではなくM2mModelについてのみ知っているものに渡した場合を想像してみてください。関数insertNewはAccountModelのみを受け取るため、別のM2mModelは機能しません。

于 2012-11-28T20:41:13.670 に答える