2011-02-26 11 views
6

Decir que tengo el siguiente:Constructor encadenamiento en conjunción con la invocación constructor base

class Base { 
    public Base (int n) { } 
    public Base (Object1 n, Object2 m) { } 
} 

class Derived : Base { 

    string S; 

    public Derived (string s, int n) : base(n) { 
     S = s; 
    } 

    public Derived (string s, Object1 n, Object2 m) : base(n, m) { 
     S = s; // repeated 
    } 
} 

Aviso cómo necesito argumento formal n en ambas sobrecargas del derivado y por lo tanto tengo que repetir la línea N = n;.

Ahora sé que esto se puede encapsular en un método separado, pero aún necesita las mismas dos llamadas a métodos de ambas sobrecargas. Entonces, ¿hay una manera más "elegante" de hacer esto, tal vez usando this junto con base?

Esto es para que yo pueda tener un constructor privado que tome un argumento s y las otras dos sobrecargas pueden llamar a esa ... ¿o es esto exactamente lo mismo que tener un método privado separado?

+1

¿Qué pasa con sólo llamar a la otra sobrecarga del constructor del constructor que acepta un adicional ¿parámetro? 'this (s, n)' en lugar de 'base (n, m)' –

+0

Modifiqué la pregunta para que refleje mejor lo que tengo actualmente. Cambié los tipos de argumentos del constructor base sobrecargado. –

+0

Ah, muy bien. Al principio no lo publiqué como respuesta porque supuse que me estaba perdiendo algo obvio. Resulta que ese fue de hecho el caso. –

Respuesta

5

No existe una solución ideal para eso. Hay una manera de evitar la repetición del código en los Derived constructores, pero luego se va a repetir el valor por defecto de la m parámetro:

public Derived (string s, int n) : this(s, n, 0) {} 
+0

Modifiqué la pregunta para que refleje mejor lo que tengo actualmente. Cambié los tipos de argumentos del constructor base sobrecargado. –

+0

@Andreas Grech: en ese caso ni siquiera puedes hacer lo que sugerí. No hay forma de evitar repetir ese código. – Guffa

0

sólo una ligera mejora, pero ...

class Derived : Base 
{ 
    string S; 
    public Derived(string s, int n) : this(s,n,-1) 
    { 
    } 

    public Derived(string s, int n, int m) : base(n, m) 
    { 
     S = s; 
     // repeated  
    } 
} 
+0

Ah no, eso no lo va a cortar; y además, parece una solución bastante fea, sin mencionar el hecho de que -1 puede ser un valor válido en la sobrecarga de 3 argumentos –

Cuestiones relacionadas