6

サブクラスによってオーバーライドされたときに、ベースメソッドに同じ特定のサブクラスインスタンスを強制的に取り込むにはどうすればよいですか?

すなわち:

abstract class Animal {
  def mateWith(that: Animal)
}

class Cow extends Animal {
  override def mateWith...?
}

論理的には、は別のCowにしかできないはずです。ただし、そうすると、これは実際には基本クラスのメソッドをオーバーライドしません(サブクラスにその存在を強制したいので、これをオーバーライドします)。mateWithCowoverride def mateWith(that: Cow)

他のインスタンスがCowタイプであることを確認し、そうでない場合は例外をスローすることができます-これは私の最良のオプションですか?もっと動物がいる場合はどうなりますか?例外をスローするコードを繰り返す必要があります。

4

1 に答える 1

11
abstract class Animal[T <: Animal[T]] {
  def mateWith(that: T)
}

class Cow extends Animal[Cow] {
  override def mateWith(that: Cow) { println("cow") }
}

class Dog extends Animal[Dog] {
  override def mateWith(that: Dog) { println("dog") }
}

そして、次のように使用します。

scala> (new Cow).mateWith(new Cow)
cow

scala> (new Cow).mateWith(new Dog)
<console>:17: error: type mismatch;
 found   : Dog
 required: Cow
              (new Cow).mateWith(new Dog)
                                 ^

例外をスローするコードは必要ありません。型システムはコンパイル時にそれを処理します!

于 2012-04-17T21:17:32.750 に答える