2011-09-28 8 views
11

estoy tratando de obtener una mejor comprensión de la Scala, y me parece que no puede encontrar un caso de uso válidos para el código como el siguiente:¿Cuál es el propósito de extender un tipo anónimo en Scala?

class C extends { def m() { /* ... */ } } 

¿Cuál es la justificación para permitir que tales construcciones?

Gracias!

+2

El ejemplo que usted da no es un tipo estructural, sino una clase anónima. No es que explique por qué puede ampliarlo ... –

+0

Derecho, actualización del título – Eyvind

Respuesta

12

Supongo que el único razonamiento aquí es "evitar casos especiales si es posible". Puede ampliar cualquier clase, una clase anónima es una clase, por lo que puede extender una clase anónima.

+0

Probablemente tenga razón (+1). Me encantaría un caso de uso real, sin embargo, si uno realmente existe :) – Eyvind

+1

No creo que haya uno ... –

+0

Estoy de acuerdo con Kim, heredar permite compartir comportamientos o representar una jerarquía determinada. Pero si la clase principal está anónima, no puede tener dos clases secundarias que extiendan la misma clase principal. – paradigmatic

11

¡Esa no es, de hecho, una clase anónima! Es un inicializador inicial y se ejecuta como parte del constructor que va antes de su superclase. Citando la excelente respuesta de another stackoverflow question:

abstract class X { 
    val name: String 
    val size = name.size 
} 

class Y extends { 
    val name = "class Y" 
} with X 

Si el código se escribieron en cambio, como

class Z extends X { 
    val name = "class Z" 
} 

luego una excepción de puntero nulo ocurriría cuando Z consiguió inicializado, porque el tamaño es inicializado antes del nombre de la normalidad orden de inicialización (superclase antes de la clase).

Cuestiones relacionadas