Kev*_* Li 6 inheritance overriding scala
当由子类覆盖时,如何强制基本方法接受相同的特定子类实例?
即:
abstract class Animal {
def mateWith(that: Animal)
}
class Cow extends Animal {
override def mateWith...?
}
Run Code Online (Sandbox Code Playgroud)
从逻辑上讲,a Cow应该只能够mateWith另一个Cow.但是,如果我这样做override def mateWith(that: Cow),这实际上并没有覆盖基类方法(我想要它,因为我想强制它在子类中存在).
我可以检查以确保其他实例是Cow类型,并且如果不是则抛出异常 - 这是我最好的选择吗?如果我有更多的动物怎么办?我将不得不重复抛出异常的代码.
dhg*_*dhg 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") }
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
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)
^
Run Code Online (Sandbox Code Playgroud)
不需要抛出异常代码; 类型系统在编译时为您处理它!
| 归档时间: |
|
| 查看次数: |
2634 次 |
| 最近记录: |