gpt4 book ai didi

scala - 用子类参数覆盖子类方法?

转载 作者:行者123 更新时间:2023-12-04 13:53:19 26 4
gpt4 key购买 nike

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

IE。:

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

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

从逻辑上讲, Cow应该只能对另一个 mateWith进行 Cow。但是,如果我执行 override def mateWith(that: Cow),那么它实际上并不会覆盖基类方法(我想要它,因为我想在子类中强制其存在)。

我可以检查以确保其他实例的类型为Cow,如果不是,则抛出异常-这是我的最佳选择吗?如果我有更多的动物怎么办?我将不得不重复抛出异常的代码。

最佳答案

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)
^

不需要抛出异常的代码;类型系统会在编译时为您处理!

关于scala - 用子类参数覆盖子类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10199254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com