de Igor es un buen ejemplo de cómo se debe escribir los constructores en esta situación. Para abordar el caso más general de tu oración final: no puedes encadenar a más de un constructor. No puede llamar a un constructor base y otro constructor en la clase actual.
Hay dos patrones típicos para el constructor sobrecargado. En el primer patrón, el conjunto de sobrecargas de la clase derivada coincide aproximadamente con el conjunto de sobrecargas para la clase base: intenta hacer que la clase derivada se sienta como si hubiera heredado los constructores, efectivamente. (Los propios constructores no son heredados, pero si proporciona las mismas firmas, entonces le parece a la persona que llama). Este suele ser el caso cuando su clase derivada no necesita información adicional. Por supuesto, cada constructor puede tener parámetros adicionales, y solo pasar un subconjunto hasta el constructor base, pero eso puede comenzar a complicarse.
En el segundo patrón, tiene varios constructores en la clase derivada, cada uno de los cuales llama a un constructor "maestro" en la misma clase (derivada). Este constructor maestro tiene la mayoría de los parámetros, ya que necesita poder manejar todo especificado por cualquiera de los otros constructores. A veces, el constructor maestro debe ser privado, si algunas combinaciones no tienen sentido, pero es conveniente especificarlas en un solo lugar cuando sabes que solo puedes alcanzar el código a través de un constructor público sensato. En este caso, solo que el constructor "maestro" encadena directamente al constructor de la clase base. Esto se usa típicamente cuando la clase derivada tiene varias piezas adicionales de información más allá de lo que necesita la clase base.
Hay híbridos de este patrón en los que tienes múltiples maestros con "grupos" de sobrecargas que llaman a los maestros ... pero te aconsejo que intentes mantenerlo simple siempre que sea posible. Considere también la posibilidad de proporcionar métodos de fábrica estáticos en lugar de constructores, que pueden terminar convirtiendo el código en más legible, ya que puede asignar un nombre a los métodos según su finalidad/parámetros; consulte TimeSpan.FromMinutes
, por ejemplo.
El único problema posible que puedo ver aquí sería si ** no ** quería 'Class2 (int a): base (a)', sino ** ** quería 'Class2(): base (2) '. Sin embargo, no puedo pensar en una estructura de clase donde tal decisión sería el mejor diseño. –
que yo sé, pero quiero ejecutar dos de ellos en el constructor predeterminado de la clase derivada, es decir, quiero ejecutar el constructor de bases parametrizado y el derivado del constructor predeterminado de la clase derivada (puede escribir en algún lugar de la definición) – Nits
Derecha , no puedes hacer eso, solo puedes llamar a * otro constructor *, no a ambos. Creo que deberías reconsiderar el diseño que requiere que los constructores sean llamados de esta manera. –