2010-08-03 22 views
5

que quiero hacer algo como estollamar al constructor de otro constructor

public class Class1 
    { 
     public Class1() 
     { 

     } 
     public Class1(int a) 
     { 

     } 
    } 
    public class Class2 :Class1 
    { 
     public Class2(int a) 
     { 

     } 
     public Class2(): base(2) 
     { 
     this(2); // new Class2(2); 
     } 

    } 

Sé que esto no se puede lograr en Java (se puede utilizar uno entre (super o el presente) en la primera línea)

¿Pero de alguna manera necesito este tipo de trabajo para lograrlo? Significa llamar al constructor parametrizado de la clase base parametrizada y derivada de la clase en el constructor predeterminado de la clase derivada.

Respuesta

9

MSDN article en constructores es bastante bueno. Aquí están algunos bits relevantes:

Un constructor puede utilizar la palabra clave de base para llamar al constructor de una clase base .
....
Un constructor puede invocar a otro constructor en el mismo objeto utilizando la palabra clave this. Al igual que la base, esto puede ser usado con o sin parámetros, y cualquier parámetro en el constructor está disponible como parámetros para esto, o como parte de una expresión.

esto debería funcionar: Respuesta

public class Class1 
{ 
    public Class1() 
    { 

    } 
    public Class1(int a) 
    { 

    } 
} 
public class Class2 :Class1 
{ 
    public Class2(int a) : base(a) 
    { 

    } 
    public Class2(): this(2) 
    { 
    } 

} 
+0

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. –

+0

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

+2

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. –

2

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.

1

Eso es imposible en ambos idiomas (por una buena razón). De lo contrario, llamaría a los constructores base varias veces debido a la llamada base implícita si no hay una base explícita o esto. Esto podría conducir a un comportamiento no deseado.

+0

, esto también me parece bien. Pero, ¿cuál es el daño si llamamos a más tiempo el mismo construtor de base? – Nits

+0

Se supone que un constructor debe ejecutarse solo una vez. Si su inicialización es sencilla, como establecer las variables predeterminadas, no hay problema (excepto por el rendimiento ya que realiza la tarea dos veces), pero si completara una lista en su constructor, tendría todas las entradas dos veces. Creo que hay mejores razones, para mí solo se siente inseguro. Tal vez alguien puede dar un mejor ejemplo? – atamanroman

Cuestiones relacionadas