int a, b, c;
Constructor()
{
a = 5;
b = 10;
c = 15;
//do stuff
}
Constructor(int x, int y)
{
a = x;
b = y;
c = 15;
//do stuff
}
Constructor(int x, int y, int z)
{
a = x;
b = y;
c = z;
//do stuff
}
para evitar la duplicación de "cosas" y algunas asignaciones, probé algo como:¿Cómo puedo usar múltiples constructores para eliminar código duplicado mientras mantengo la legibilidad?
int a, b, c;
Constructor(): this(5, 10, 15)
{
}
Constructor(int x, int y): this(x, y, 15)
{
}
Constructor(int x, int y, int z)
{
a = x;
b = y;
c = z;
//do stuff
}
Esto funciona para lo que yo quiero hacer, pero a veces necesito utilizar un código largo para crear nuevos objetos o hacer algunos cálculos:
int a, b, c;
Constructor(): this(new Something(new AnotherThing(param1, param2, param3),
10, 15).CollectionOfStuff.Count, new SomethingElse("some string", "another
string").GetValue(), (int)Math.Floor(533/39.384))
{
}
Constructor(int x, int y): this(x, y, (int)Math.Floor(533/39.384))
{
}
Constructor(int x, int y, int z)
{
a = x;
b = y;
c = z;
//do stuff
}
Este código es más o menos lo mismo que antes, sólo los parámetros que se están pasando no son muy legibles. Preferiría hacer algo como:
int a, b, c;
Constructor(): this(x, y, z) //compile error, variables do not exist in context
{
AnotherThing at = new AnotherThing(param1, param2, param3);
Something st = new Something(aThing, 10, 15)
SomethingElse ste = new SomethingElse("some string", "another string");
int x = thing.CollectionOfStuff.Count;
int y = ste.GetValue();
int z = (int)Math.Floor(533/39.384);
//In Java, I think you can call this(x, y, z) at this point.
this(x, y, z); //compile error, method name expected
}
Constructor(int x, int y): this(x, y, z) //compile error
{
int z = (int)Math.Floor(533/39.384);
}
Constructor(int x, int y, int z)
{
a = x;
b = y;
c = z;
//do stuff
}
Básicamente estoy construyendo los parámetros dentro del cuerpo del constructor. Entonces estoy tratando de pasar esos parámetros construidos a otro constructor. Creo que recuerdo haber podido utilizar las palabras clave "este" y "super" para llamar a los constructores mientras estaba dentro del cuerpo de otro constructor al codificar en Java. No parece posible en C#.
¿Hay alguna manera de hacer esto fácilmente? ¿Hice algo incorrectamente? Si esto no es posible, ¿debería seguir con el código ilegible?
Supongo que siempre podría cortar el código duplicado en otro método completamente fuera de los constructores. Entonces cada constructor simplemente haría lo suyo y llamaría al código compartido por los otros constructores.
Creo que esta ruta me puede gustar mucho mejor que los métodos de fábrica. Estaba dudando en modificar mi código usando métodos de fábrica, principalmente porque estoy usando la herencia. Al ser un programador novato, estaba teniendo dificultades para visualizar todos los cambios que tendrían que producirse. Tengo un par de constructores sobrecargados en mis clases base. Las clases derivadas están agregando sus propios bits a los constructores base. Dependiendo de la clase derivada, se necesitan diferentes cálculos para encontrar ciertos parámetros. Usar una clase privada para manejar parámetros complejos parece ser el enfoque más simple. – Cheese
Decidí ir con otra solución.Después de leer el enlace que publicó, comencé a leer la página "Demasiados parámetros" en el mismo sitio. Leer a través de eso me hizo considerar que tal vez los constructores se hicieron demasiado complicados por todos los parámetros que les pasé. He decidido recortar la mayoría de los parámetros de los constructores. Establecer esos campos se hará en otro lugar en el código. En lugar de "¿cómo puedo hacer esto con los constructores?", Creo que mi problema real era "¿realmente necesito pasar esos muchos parámetros?". Como el enlace que me proporcionó me llevó a mi respuesta ... – Cheese
y la respuesta que publicó fue la que consideré la mejor solución para mi pregunta original, estoy eligiendo su respuesta como respuesta. – Cheese