2012-06-20 21 views
7

Tengo una clase con dos constructores (C#). Aquí está el fragmento de código:Llamar a un constructor de otro constructor en la misma clase

public class FooBar() 
{ 
    public FooBar(string s) 
    { 
     // constructor 1, some functionality 
    } 

    public FooBar(int i) : this("My String") 
    { 
     // constructor 2, some other functionality 
    } 

} 

Sí, sé que puedo llamar a un constructor desde otro utilizando el enfoque mencionado anteriormente. Pero en este escenario, si llamo al constructor 2, todas las declaraciones en el constructor 1 se ejecutarán ANTES de que se ejecute la misma instrucción en el constructor 2.

Lo que yo quiero es que después de todas las declaraciones en el constructor 2 se ejecutan, entonces será llamada al constructor 1.

En mi situación exacta, estoy haciendo la autenticación de usuarios. Constructor 1 recupera la información del usuario solo con la identificación del usuario, pero el constructor 2 realiza la autenticación del usuario mediante correo electrónico y contraseña. Si un usuario está en la base de datos, obtiene la identificación del usuario y ahora quiero que el constructor 1 complete todas las propiedades de la clase.

Háganme saber si necesita información adicional. Si crees que hay otro enfoque mejor, me complacerá escuchar la sugerencia.

ACTUALIZACIÓN 1: me pregunto por qué algo como esto no está implementado:

public FooBar(bool b) 
{ 
    // constructor 3, some more functionality 
    this.FooBar("My String"); // calling constructor 1 
} 
+2

scenerio interesante. Podrías mover la funcionalidad en una función separada, o crear un Constructor sobrecargado 'FooBar (string s, int i)'. Puede que no sea la mejor solución, pero solo arrojando algunas ideas. – Justin

+0

@Justin, poner lógica en otro método parece ser una mejor idea. Gracias. – Farhan

Respuesta

7

En este caso simplemente no lo utiliza llamadas a constructores, sino algo así como:

public class FooBar() 
{ 
    public FooBar(string s) 
    { 
     Init1(); 
    } 

    public FooBar(int i) 
    { 
     Init2(); 
     Init1(); 
    } 

} 

Donde se supone que Init1(..) y Init2(..) son métodos relacionados con alguna lógica de inicialización específica del constructor correspondiente.

Actualmente, puede organizar las llamadas a esta función de la manera que mejor se adapte a sus necesidades.

2

Por qué no envuelva esa funcionalidad en algunos llaman method y que en los constuctors (o donde quieras)?

public class FooBar() 
{ 
    public FooBar(string s) 
    { 
     LoadUser(s); 
    } 

    public FooBar(int i) : this("My String") 
    { 
     var s=CheckUser(); 
     LoadUser(s); 
    } 

    private string CheckUser() 
    { 
     return "the id/name from db"; 
    } 
    private void LoadUser(string s) 
    { 
      //load the user 
    } 

} 

Esto es una solución genérica. Puede cambiar el tipo de devolución según su escenario específico.

2

En general se puede usar esto:

public class FooBar() 
{ 
    private Test(string s) 
    { 
     // Some functionality 
    } 

    public FooBar(string s) 
    { 
     Test(s); 
    } 

    public FooBar(int i) 
    { 
     // Do what you need here 
     Test("MyString"); 
    }  
} 
1

Mejor enfoque: no ponga esa lógica en el constructor. Explórelo a otros métodos a los que pueda llamar a voluntad sin preocuparse por el encadenamiento de constructores.

+0

Gracias. Estoy de acuerdo en que el encadenamiento de constructores puede causar confusión, y es posible que no obtenga exactamente lo que necesitaba. Voy a usar otros métodos privados. – Farhan

8

puede utilizar otro método privado para hacer la inicialización:

public class FooBar() 
{ 
    public FooBar(string s) 
    { 
     this.Initialize(s); 
    } 

    public FooBar(int i) 
    { 
     this.Initialize("My String"); 
    } 

    private void Initialize(string s) { 
     // Do what constructor 1 did 
    } 
} 
Cuestiones relacionadas