9

在 Enumeration#Val 类的 Scaladoc 中,我可以读到:“实现 Value 类型的类。可以重写此类以更改枚举的命名和整数标识行为。” 我很困惑:我如何覆盖一个类?诸如此类的事情override class Val extends super.Val是不允许的。

4

1 回答 1

12

Scala 中(还)没有虚拟类,因此您不能编写override class Val ...,然后确保调用new Val将为新实例动态选择正确的类。取而代之的是,将根据对封闭类实例(在本例中为Enumeration)的引用类型来选择类。

模拟虚拟类的一般技巧是编写class Val extends super.Val,然后重写一个受保护的方法,该方法用作类实例的工厂。在这种情况下,您还必须重写该方法:

protected def Value(i: Int, name: String): Value = new Val(i, name)

Enumeration将创建Val仅使用此工厂方法的实例。一般来说,这种模式需要程序员方面的纪律,但可以通过将构造函数声明为私有来确保,强制程序员使用工厂方法。

于 2010-12-02T17:11:51.047 回答