2010-12-02 15 views
9

En el Scaladoc de la clase Enumeration # Val, puedo leer: "Una clase que implementa el tipo de valor. Esta clase puede anularse para cambiar el nombre de la enumeración y el comportamiento de identificación de entero". Estoy perplejo: ¿cómo anulo una clase? Cosas como override class Val extends super.Val no están permitidas.¿Cómo se "anula" una clase interna en Scala?

+0

Es posible definir una clase interna, p. en un 'objeto MyEnum extiende la enumeración' como así:' clase Val (i: Int, nombre: Cadena) extiende super.Val (i, nombre) ', pero apenas anula la enumeración # Val ya que no se instancia en todas. –

Respuesta

12

No hay clases virtuales en Scala (todavía), por lo que no puede escribir override class Val ..., y luego asegúrese de que al invocar new Val se elegirá dinámicamente la clase correcta para la nueva instancia. Lo que ocurriría en su lugar es que la clase se elegiría según el tipo de referencia a la instancia de la clase adjunta (en este caso, Enumeration).

El truco general para emular las clases virtuales es escribir class Val extends super.Val, y luego anular un método protegido que sirve como una fábrica para las instancias de la clase. En este caso, también se tendría que reemplazar el método:

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

Enumeration va a crear instancias de Val única que utilizan este método de fábrica. En general, este patrón requiere disciplina por parte del programador, pero puede garantizarse declarando a los constructores privados, forzando al programador a utilizar el método de fábrica.

+0

Gracias por la explicación. Ahora estoy aún más curioso acerca de cómo voy a anular un método final ... –

+0

Hm ... tienes razón ... déjame ver esto. – axel22

+0

(Solo como explicación para otros lectores: el método que mencionas es realmente definitivo en Enumeration.scala). Por cierto, escribiste "No hay clases virtuales en Scala (todavía)". ¿Alguna evidencia que pueda venir en el futuro? –

Cuestiones relacionadas