【发布时间】:2021-07-19 05:45:10
【问题描述】:
我的印象是,密封类主要用于将所有详尽的子类编写在同一个编译单元(恰好是 Scala 中的一个文件)中。
但是,请考虑以下情况。我有一个名为 AnimalsPart1.scala 的文件,其中有以下声明:
sealed class Animal
case class Dog() extends Animal
case class Cat() extends Animal
class Herbivore() extends Animal
接下来,我有一个名为 AnimalPart2.scala 的文件,其中我有以下声明:
case class Hen() extends Herbivore
def whatAnimalAmI(a : Animal) = a match {
case Dog() => "Dog"
case Cat() => "Cat"
case Hen() => "Hen"
}
println(whatAnimalAmI(new Hen()))
// prints "Hen" as the output
允许类继承密封类,然后让这些类在任何地方都可以继承,这破坏了密封类的创建原则。这是一个小例子,但如果上述属性成立,则很难列出给定密封类的详尽子类集。
因此,为什么允许非 case 类继承密封类?还有,我们如何处理上面的问题(Hen在声明了密封类的文件之外继承了一个Animal)?
【问题讨论】:
-
Hen不是继承自Animal,而是继承自Herbivore,它不是密封的。密封只防止直接继承。
标签: scala inheritance case-class