0

abstract class Base[T]ユーザーが指定した型を超えるライブラリがありTます。多くの特定Base[T]のサブクラスがあり、一部はTSなどのオーバー タイプSpecific[T, S]ですが、これは関係ありません。もちろん、ユーザーはインスタンスの作成中に任意のものを指定できますが、それを特性Tとして扱いたい、つまり、ユーザーのタイプを. Scalaでそれを行うにはどうすればよいですか? この質問のタイトルが正しいことを願っています。TAdditionalAbilitiesAdditionalAbilities

例 (構文的に正しくない可能性があります)

class Specific[T **with trait Additional**]() extends Base[T](){
  def doSomething() : T = {
    val something = new T()
    something.ability(2)
    println(something.additional)
    something
  }
}

trait Additional{
  var additional : Integer

  def ability(i : Integer) : Unit = {
    additional = i
  }
}

どんなものでも動作しますT

4

2 に答える 2

0

おそらく暗黙のクラスが役立つでしょうか?暗黙的なクラスを使用すると、既存の型を変更したり、それをインスタンス化したりする必要なく、既存の型に機能を追加できます (そのため、特性を混在させることができます)。

以下はコンパイルして出力します: 3

class Specific[T] {
  implicit class TAdditional(t: T) {
    var additional: Integer = 0
    def ability(i: Integer) = {
      additional = i
    }
  }

  def doSomething(t: T) = {
    doSomethingAdditional(t)
  }

  private def doSomethingAdditional(t: TAdditional) = {
    t.ability(3)
    println(t.additional)
  }
}

val s = new Specific[Int]
s.doSomething(5)

注: TAdditional の同じインスタンスにアクセスしていることを確認するために何かを行う必要があります。そのため、TAdditional を引数として取るプライベートな doSomethingAdditional メソッドを作成しました。「doSomething」でアビリティとアディショナルを呼び出すと、#アビリティと #アディショナルにアクセスしようとすると、TAdditional の個別のインスタンスが作成され、「0」が出力されます。

于 2015-04-23T23:12:18.430 に答える