3

私はこのようなクラスを持っています:

abstract class CrudResource extends Controller {
  type ResourceIdType


  def getAction(id: ResourceIdType) = ...
  def deleteAction(id: ResourceIdType) = ...

  ...
}

これは、次のように使用することを目的としています。

class Payees extends CrudResource {
  type ResourceIdType = Int

  ...
}

ResourceIdType次のように、デフォルトでIntに設定したいと思います。

abstract class CrudResource extends Controller {
  type ResourceIdType = Int

  ...
}

Intサブクラスが次のようにオーバーライドしない限り、IDタイプは次のようになります。

override type ResourceId = String

しかし、これは次のコマンドでコンパイルできません。

error: overriding type ResourceIdType in class CrudResource, which equals Int;
 type ResourceIdType has incompatible type
       class Payees extends CrudResource { override type ResourceIdType = String }

私がやろうとしていることをすることは可能ですか?CrudResource、で試しましたtype ResourceIdType <: Any = Intが、これは有効な構文ではありません。

4

4 に答える 4

2

あなたが本当にこれを行うことができるかどうかはわかりませんが、ジェネリックスと継承はそれを素晴らしい方法で行うことができます:

abstract class CrudController [T] {

    def getAction( resource : T )
    def deleteAction( resource : T )
    def updateAction( resource : T )

}

abstract class IntCrudController extends CrudController [Int]

class PayeesController extends IntCrudController {

    override def getAction( resource : Int ) {}

    def deleteAction(resource: Int) {}

    def updateAction(resource: Int) {}
}
于 2012-06-20T01:43:23.853 に答える
2

これは、リスコフの置換原則に違反することになります。あなたがそれを行うことができると仮定しましょう。

abstract class CrudResource extends Controller {
  type ResourceIdType = Int
  def resources: List[ResourceIdType] = ???
  def getAction(id: ResourceIdType) = ???
  def deleteAction(id: ResourceIdType) = ???
}

class Payees extends CrudResource {
  override type ResourceIdType = String
}

class Trouble {
  var resource: Controller.ResourceIdType
}
val trouble = new Trouble
val crudResource: CrudResource = new Payee
trouble.resource = crudResource.resources.head // assigning String to Int var!

しかし、あなたはケーキパターンの途中です。ResourceIdを抽象ネストされたクラスとして定義する場合、そのAPIが特定のタイプを公開しない限り、Intまたはの観点からそれらを実装するサブクラスを持つことができます。String

于 2012-06-20T17:31:01.980 に答える
1

いいえ、私が知る限り、これは不可能です。

于 2012-06-20T05:47:15.720 に答える
1

Scalaの抽象型は、定義するとフリーズします。継承されたクラスで、あるタイプを別のタイプでオーバーライドすることはできません

于 2012-06-20T13:14:57.353 に答える