2011-06-16 20 views
15

El título puede sonar confuso. Lo que quiero es llamar a un constructor de la misma clase y al constructor de la clase base dentro de un constructor. Tal vez mi primer intento de resolver que podría explicar mi pregunta:Constructor de base de llamadas y otro constructor en el constructor

public MyClass(MyClass obj) : base(obj),this() {} 

Pero que la notación no está funcionando. ¿Hay alguna solución para resolver eso?

+2

¿Qué ocurre si su constructor sin parámetros ('this()') especifica un constructor de clase base diferente (que lo hace implícitamente, el parámetro sin especificar, si no se especifica).¿Qué constructor de la clase base debería invocarse? –

Respuesta

12

No, no lo puede hacer por la siguiente razón:

Cuando un constructor llama al constructor de su base, esta última llamada es la parte de la constructora en cuestión. De modo que no puede llamar a otro constructor de la misma clase Y a un constructor de una clase base porque la llamada anterior ya contiene una llamada a un constructor base: no puede inicializar su base dos veces

1

Simplemente puede copiar el código de constructor en el constructor dado. O haga una función especial de configuración() que se llama desde el constructor predeterminado y este constructor.

+0

Gracias por su publicación. Sí, esta es una solución que consideré. Pero espero que haya una solución como llamar a base() y esto() en un constructor, como es posible en, por ejemplo, Java. – Kai

2

Sin solución técnica para esto, necesita una solución alternativa, mover la lógica del constructor predeterminado, hacer que la llamada base sea una función virtual que sobrescribir en su súper clase.

+0

Llamar a los métodos virtuales en un constructor generalmente no es un buen estilo. – leppie

+0

¿Quiere decir "hacer que la clase base llame algo", o "hacer que la base invoque algo"? Además, ¿por qué debería uno anular una función virtual dentro de la clase base? Las funciones virtuales deben ser anuladas en subclases. –

+0

Llamar a un método virtual desde no es una buena manera de resolver esto. Ver: http://blogs.msdn.com/b/ericlippert/archive/2008/02/18/why-do-initializers-run-in-the-opposite-order-as-constructors-part-two.aspx Y el comentario de Eric el 18 de febrero de 2008 6:50 p. M. – thekip

0

En C# también puede proporcionar una inicialización por defecto en la declaración de cada miembro:

private int foo_ = 41; 

Esto resuelve muchos problemas para su uso-otra-constructor.

2

Una forma sería hacer el constructor sin parámetros de MyClass para llamar al base(obj). Pero si no siempre quieres hacer eso, entonces no creo que haya una buena manera.

Quizás puedas intentar mover cosas en esos constructores. ¿Puedes publicar más información sobre lo que sucede realmente en estos constructores?

+0

Es para implementar constructores de copias. Para que pueda llamar al "material predeterminado" del constructor sin parámetros y pueda llamar al constructor base. – Kai

+0

¿no puedes poner las "cosas predeterminadas" del constructor sin parámetros en la base? ¿O simplemente cópialo al otro constructor? –

5

C# permite la base (...) o esto (...), porque cada constructor debe invocar eventualmente a un superconstructor. Entonces, si fuera posible invocar tanto base() como this(), se realizarían dos invocaciones de superconstructores, lo cual sería fundamentalmente incorrecto.

Es la misma razón por la que no es posible invocar base (...) dos veces.

+0

Ok, entiendo por qué no es posible resolverlo como lo intenté. Entonces parece que tengo que usar una solución alternativa. – Kai

+0

Por favor, lea cuidadosamente todas las respuestas de otras personas sobre una alternativa – Nick

-1

En realidad, puede hacerlo, Puede disparar el constructor de la clase padre de la instancia de clase hija, aquí es cómo se hace:

public class Person 
{ 
    public Person(int age) { 
     this.Age = age; 
    } 
    public int Age; 
} 

public class students :Person 
{ 
    public students(string name, int age) :base(age) 
    { 
     this.studentName = name; 
     this.Age = age; 
    } 

    public string studentName; 
} 

Ahora, digamos que usted está creando un objeto de estudiantes clase, Por lo tanto, usted hará esto:

estudiantes std = new students ("Jack", 23);

Esto enviará "Jack" al constructor de la clase los estudiantes, y 23 será enviada a la persona a través del constructor: base (edad)

Esperanza esta ayuda, Saludos.

Cuestiones relacionadas