2011-05-06 7 views
5

Tengo una clase padre que tiene un constructor sobrecargado, y tengo una subclase que tiene un constructor con parámetros opcionales. ¿Hay alguna manera de que los constructores de la subclase sigan exponiendo el carácter sobrecargado de la clase padre mientras se conservan sus propios parámetros opcionales?En C# 4, ¿cómo puedo tener constructores con parámetros opcionales en una subclase de un padre con un constructor sobrecargado?

Aquí hay un código de ejemplo de las dos clases y sus constructores necesarios:

class Foo { 
    Foo(String arg0) 
    { 
     // do some stuff with arg0 
    } 

    Foo(String arg0, List<x> arg1) 
     : this(arg0) 
    { 
     // do some other stuff with arg1 that is special because we have an arg1 
    } 
} 

class Bar : Foo { 
    Bar(String arg0, List<y> arg2 = null, String arg3 = "") 
     : base(arg0) 
    { 
     // some third thing with arg2 and arg3 
    } 
} 

Esta es la firma del método para el otro constructor de la subclase me gustaría tener también para exponer la sobrecarga del constructor de los padres, pero la pregunta es cómo hacerlo:

Bar(String arg0, List<x> arg1, List<y> arg2 = null, String arg3 = "") 

tengo, creo, se encontró una solución, pero no estoy seguro de que es tan limpio como podría ser. Lo publiqué como una respuesta en caso de que sea la única opción.

+0

¿Se puede cambiar la firma del 'foo' tener sólo un constructor' Foo (String arg0, Lista arg1 = null) '? ¿O necesita distinguir entre pasar nulo y no pasar un valor en absoluto? – Davy8

+0

@ Davy8 - Necesito distinguir entre pasar nulo vs. no pasar nada como ese parámetro. Actualizaré el ejemplo para reflejar esto. Desafortunadamente, es mucho más complicado que este ejemplo, pero lo que tengo aquí es el quid de la cuestión. – cdeszaq

+1

Personalmente, intentaré revisar el diseño para ver si sería posible cambiarlo para que no tenga ese requisito, pero es difícil decir si eso es posible sin saber más sobre lo que se supone que debe hacer. – Davy8

Respuesta

1

Aquí está la solución que he llegado con:

class Foo { 
    Foo(String arg0) 
    { 
     // do some stuff with arg0 
    } 

    Foo(String arg0, List<x> arg1) 
     : this(arg0) 
    { 
     // do some other stuff with arg1 
    } 
} 

class Bar : Foo { 
    Bar(String arg0, List<y> arg2 = null, String arg3 = "") 
     : base(arg0) 
    { 
     this.Initialize(arg2, arg3); 
    } 

    Bar(String arg0, List<x> arg1, List<y> arg2 = null, String arg3 = "") 
     : base(arg0, arg1) 
    { 
     this.Initialize(arg2, arg3); 
    } 

    private void Initialize(List<y> arg2, String arg3) 
    { 
     // some third thing with arg2 and arg3 
    } 
} 

parece un poco sucia porque no estoy encadenando constructores de la subclase juntos y estoy llamando a una función en su lugar, pero no puedo imaginar cualquier otra forma de hacer esto.

3

Si puede cambiar Foo que sólo tienen un constructor con un parámetro opcional que puede hacer lo siguiente:

public class Foo 
{ 
    public Foo(String arg0, List<x> arg1 = null) 
    { 
     // do some stuff with arg0 
     if (arg1 != null) 
     { 
      // do some other stuff with arg1 
     } 
    } 
} 

public class Bar : Foo 
{ 
    public Bar(String arg0, List<x> arg1 = null, List<y> arg2 = null, String arg3 = "") 
     : base(arg0, arg1) 
    { 
     // some third thing with arg2 and arg3 
    } 
} 
Cuestiones relacionadas