6

当被子类覆盖时,如何强制基方法采用相同的特定子类实例?

IE:

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

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

从逻辑上讲, aCow应该只能到mateWithanother Cow。但是,如果我这样做override 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 回答