2011-10-12 10 views
7

Pregunta ingenua, creo, pero todo lo que encuentro es simplemente llamar a otros constructores de los constructores. Necesito llamar a un método. Mi clase (inicio):¿Cómo agregar alguna acción en el constructor?

class ScopedIterator[T](val iter : Iterator[T]) 
{ 
    private var had_next : Boolean; 
    private var value : T; 

    moveNext(); 

    ... 

así que me gustaría tener un constructor con solo argumento, y en tal constructor de llamar a un método MoveNext. Eso es todo.

Cuando puedo compilar el código me sale error:

error: abstract member may not have private modifier

private var had_next : Boolean;

y lo mismo para valor.

lo cambié a:

class ScopedIterator[T] 
{ 
    private var had_next : Boolean; 
    private var value : T; 
    private var iter : Iterator[T]; 

    def this(it : Iterator[T]) = 
    { 
    iter = it; 
    moveNext(); 
    } 

    ... 

Pero ahora me sale error en "iter = it":

error: 'this' expected but identifier found.

iter = it;

cómo escribir como constructor en Scala?

+0

Específicamente ¿qué error obtienes en 'iter = it'? – asm

+0

@Andrew Myers, lo siento, actualizado. – greenoldman

Respuesta

18

El primer problema es que sus definiciones de had_next y value son abstractas: estos miembros no tienen ningún lado derecho.

Procurad, más bien:

class ScopedIterator[T](val iter : Iterator[T]) { 
    private var had_next : Boolean = _ 
    private var value : T = _ 
    ... 
} 

Aquí, _ significa "sin inicializar el valor por defecto". Por ejemplo, las siguientes obras para mí en la consola:

class ScopedIterator[T](val iter : Iterator[T]) { 
    private var had_next : Boolean = _ 
    private var value : T = _ 

    init() 

    def init() : Unit = { println("init !") } 
} 

scala> new ScopedIterator(List(1,2,3).toIterator) 
init ! 
resN: ScopedIterator[Int] = ... 

El segundo problema (" 'esto' espera ...") viene porque en Scala, constructores auxiliares siempre deben llamar a otro constructor como su primera declaración. Por lo tanto, su constructor podría comenzar con this(), por ejemplo. Para obtener más detalles, consulte la Sección 6.7 en Programming in Scala.

+0

Gracias, no esperaba tener que llamar ni siquiera sintetizado " constructor". – greenoldman

6

El constructor por defecto es el que se define cuando se declara la clase

Ex:

class greeting(name:String) { ... } 

También puede definir el constructor por defecto de no tomar parámetros como en el código

class greeting { ... } 

Luego puede agregar constructores adicionales. Todos los constructores que agregue a la clase necesitan llamar a otro constructor como primera declaración del constructor. Si omite, obtiene el "esperado, pero el identificador encontrado".

Veamos un ejemplo:

class classconstructor { 
    var iter:Int = 0  
    def this(it:Int) = {  
     this() 
     iter = it; 
     moveNext(); 
    } 
    def moveNext() = { 
     println(iter) 
    } 
} 

object App 
{ 
    def main(args:Array[String]) 
    { 
     val x = new classconstructor() 
     val y = new classconstructor(200)  
    } 
} 

En el código anterior nueva classConstructor() no hace nada porque el constructor vacío no tiene cuerpo. y new classconstructor (200) ejecuta el constructor vacío + el nuevo donde puede agregar código adicional como una llamada al método moveNext(). En este caso, este imprime 200 en la consola.

+0

Ambas respuestas son geniales y en total cubren todas las cuestiones. Sin embargo, puedo marcar como LA única respuesta :-(Espero que no te importe, de todos modos estoy agradecido. – greenoldman

+0

De nada. Sin preocupaciones. –

Cuestiones relacionadas