如何在Scala中“覆盖”内部类?

时间:2010-12-02 16:57:33

标签: scala enums override nested-class

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

1 个答案:

答案 0 :(得分: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的实例。一般来说,这种模式需要程序员的约束,但可以通过将构造函数声明为私有来确保,迫使程序员使用工厂方法。