2011-04-30 17 views
5

en Scala, necesito implementar algo similar a las metaclases de Python. en mi caso, el objetivo de utilizar las metaclases suele ser crear un registro de todas las subclases de una clase base particular, es decir, una asignación de, por ejemplo, una representación de cadena de la clase a una referencia a la clase. en Python es muy conveniente poner una metaclase en la clase base para que no se necesite nada especial en cada subclase. Estoy buscando hacer algo similar en Scala. ¿Hay alguna forma de emular las metaclases, o hacerlo de otra manera? ¡Gracias!scala: analogy to metaclasses in python?

+2

No está claro lo que quiere en última instancia, pero no hay equivalente a las metaclases de Python en Scala. Si desea obtener una clase de un String, debe usar Class.forName. –

Respuesta

2

No hay nada similar a las metaclases de Python. El registro del que habla podría ser posible utilizando cargadores de clases o reflejos personalizados.

+0

Gracias. ¿Puedes pensar en otra forma general de obtener una representación de cadena de un tipo de clase y luego poder instanciar un nuevo objeto de esa clase a partir de esa cadena? –

+0

@Heinrich Ver la respuesta de Randall. Una vez que tenga un 'java.lang.Class', puede llamar a' newInstance' en él. Sin embargo, si quiere encontrar todas las subclases de una clase, haga una pregunta de Java al respecto. –

4

Si conoce el nombre completo de la clase, puede cargarlo utilizando los métodos habituales de reflexión de Java en java.lang.Class, a saber, Class.forName(String fqClassName). Dada la instancia resultante de Class, la creación de instancias es fácil solo si hay un constructor de argumentos cero, de lo contrario se enreda en el mundo desordenado de todos los tipos de reflejo de Java.

Si desea un tipo de "descubrimiento" donde las clases son desconocidas en tiempo de compilación y cuyos nombres no se proporcionan como entrada o parámetro del programa de alguna manera, entonces el enfoque del cargador de clases es probablemente la única respuesta.