2012-01-04 21 views
9

Quiero llamar constructor dentro de la clase como: public class Myclass() {¿Cómo llamar al constructor dentro de la clase?

public MyClass(){ 
     //...... 
    } 

    public MyClass(int id):this(){ 
     //...... 
    } 

    private void Reset(){ 
     //..... 
     this = new MyClass(id); //here I want to call constructor 
     //...... 
    } 
} 

pero no está funcionando. ¿Es posible y cómo puedo hacerlo si sí?

+2

¿Por qué querrías hacer eso? No puede alterar el puntero 'this' de esa manera dentro de un método de instancia, ni tampoco debería querer hacerlo. –

Respuesta

10

No puede. Pero lo que podrías hacer es dividir la lógica del constructor en un método de inicialización que luego podría restablecerse.

public MyClass(){ 
    //...... 
    } 

    public MyClass(int id):this(){ 
     Initialize(id); 
    } 

    private void Initialize(int id){ 
    //.... 
    } 

    private void Reset(){ 
     //..... 
     Initialize(id); 
     //...... 
    } 
} 
3

No, esto no es posible. No puedes asignar esto.

Se puede sin embargo dejar Reset() cambio una nueva instancia de MyClass lo que el código de llamada podría decir:

public class MyClass 
{ 
    public MyClass Reset() 
    { 
     return new MyClass(); 
    } 
} 

MyClass c = new MyClass(); 
c = c.Reset(); 

O usted podría aplicar el método Reset de tal manera que todos los campos se reinicializan a sus valores por defecto.

+0

Me gusta la idea de que Reset() devuelva una nueva instancia, en ese caso probablemente debería ser 'static'. –

+2

Si se devolvió una nueva instancia, ya no se restablece nada. Está devolviendo una instancia recién creada de la clase. Tipo de engañoso. –

+0

Es cierto, quizás 'Create()' sería un mejor nombre de método. –

14

Respuesta simple: No se puede.

respuesta un poco más complicado: Mueva su lógica de inicialización en un método separado que se puede llamar desde el constructor y su Reset() método:

public class MyClass 
{ 
    public int? Id { get; } 

    public MyClass() 
    { 
     Initialize(); 
    } 

    public MyClass(int id) 
    { 
     Initialize(id); 
    } 

    public Reset() 
    { 
     Initialize(); 
    } 

    private Initialize(int? id = null) 
    { 
     // initialize values here instead of the constructor 
     Id = id; 
    } 
} 
+1

Esto es perfectamente breve y claro y me ayudó muchísimo a comprender. – secretwep

2

Usted puede llamada a un constructor para su clase dentro de su clase (de hecho, esto se hace a menudo con métodos de fábrica):

public class MyClass 
{ 
    public static MyClass Create() 
    { 
     return new MyClass(); 
    } 
} 

Pero no se puede cambiar el valor de la referencia this dentro de la clase. En su lugar, debe tener su método "Reset()" establecer los campos a sus valores predeterminados.

1

Dentro de una clase que no se puede reasignar this (aunque vale la pena señalar que dentro de una estructura que es perfectamente legal). La pregunta, sin embargo, es si debería. Supongo que su objetivo es establecer todos los valores de campo en un estado específico, por lo que otras personas ya han dicho que puede hacer que su método de reinicio devuelva una nueva instancia o puede dividir su lógica en un método Clear() y llamarlo en lugar.

Cuestiones relacionadas