Constructor y herencia

04/01/2008 - 04:12 por Rolando | Informe spam
Hola,
Si tengo estas clases:

public Class A
{
public A( ) {..}
}

public Class B : A
{
public B( ) {..}
}

al yo crear un objeto como este:

var obj=new B( );

se supone que me ejecuta solo el constructor de la clase B, o ejecuta
tambien el de la clase A?

Gracias

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
04/01/2008 - 08:32 | Informe spam
"Rolando" wrote in message
news:er2SW%
Si tengo estas clases:

public Class A
{
public A( ) {..}
}

public Class B : A
{
public B( ) {..}
}

al yo crear un objeto como este:

var obj=new B( );

se supone que me ejecuta solo el constructor de la clase B, o ejecuta
tambien el de la clase A?



Solo ejecuta el B. Si deseas ejecutar también el A (cosa que,
normalmente, casi siempre se debería hacer), la sintaxis es esta:

public Class B : A
{
public B():base() {..}
}
Respuesta Responder a este mensaje
#2 Rolando
04/01/2008 - 13:03 | Informe spam
Gracias!

"Alberto Poblacion"
escribió en el mensaje news:%
"Rolando" wrote in message
news:er2SW%
Si tengo estas clases:

public Class A
{
public A( ) {..}
}

public Class B : A
{
public B( ) {..}
}

al yo crear un objeto como este:

var obj=new B( );

se supone que me ejecuta solo el constructor de la clase B, o ejecuta
tambien el de la clase A?



Solo ejecuta el B. Si deseas ejecutar también el A (cosa que,
normalmente, casi siempre se debería hacer), la sintaxis es esta:

public Class B : A
{
public B():base() {..}
}

Respuesta Responder a este mensaje
#3 Josias
04/01/2008 - 14:26 | Informe spam
public Class B : A
{
public B():base() {..}
}





Hola Alberto,

Sobre ese mismo tema yo tambien tengo un caso donde quiero ejecutar el
constructor de una clase "abuela" y no el de la clase "madre", se puede
hacer o debo rediseñar la clase derivada?

Josias
Respuesta Responder a este mensaje
#4 Pedro Luna Montalvo
04/01/2008 - 15:16 | Informe spam
Saludos Alberto,

Lo que indicas es incorrecto. En una jerarquía de herencias, se ejecuta
siempre el constructor de la clase base, antes del propio constructor.

Si en el constructor de una clase heredera se omite la invocación explícita
de un constructor de su clase base, se invocará automáticamente a un
constructor en la clase base sin parámetros.

Te expongo el siguiente ejemplo:

class Padre {
public Padre() { System.Console.WriteLine("Padre"); }
}

class Hijo : Padre {
public Hijo() { System.Console.WriteLine("Hijo"); }
}

class Nieto : Hijo {
public Nieto() { System.Console.WriteLine("Nieto"); }
}

La siguiente línea:
Nieto x = new Nieto();

provocará que se invoque primero el constructor en Padre, luego Hijo y
finalmente Nieto. Es decir, automáticamente se está convirtiendo:
public Hijo() { }
en
public Hijo() : base() { }



Otra prueba de ello, es que lo siguiente generará un error de compilación:

class Padre {
public Padre(int x) { } // No hay constructor sin parámetros!!
}

class Hijo : Padre {
public Hijo() { } // Padre no tiene constructor sin parámetros, esto no
compilará!!
}

error CS1501: Ninguna sobrecarga para el método 'Padre' acepta '0'
argumentos





Saludos,
Pedro Luna



"Alberto Poblacion"
escribió en el mensaje de noticias:#
"Rolando" wrote in message
news:er2SW%
Si tengo estas clases:

public Class A
{
public A( ) {..}
}

public Class B : A
{
public B( ) {..}
}

al yo crear un objeto como este:

var obj=new B( );

se supone que me ejecuta solo el constructor de la clase B, o ejecuta
tambien el de la clase A?



Solo ejecuta el B. Si deseas ejecutar también el A (cosa que,
normalmente, casi siempre se debería hacer), la sintaxis es esta:

public Class B : A
{
public B():base() {..}
}

Respuesta Responder a este mensaje
#5 Josias
04/01/2008 - 16:34 | Informe spam
Hola Pedro.

Eso mismo es lo que se da cuando uno crea un Form heredable con el editor,
que mete una llamada al Initializecomponent() privado en el constructor de
cada form derivado de aquel ?



"Pedro Luna Montalvo" escribió en el mensaje
news:
Saludos Alberto,

Lo que indicas es incorrecto. En una jerarquía de herencias, se ejecuta
siempre el constructor de la clase base, antes del propio constructor.

Si en el constructor de una clase heredera se omite la invocación
explícita de un constructor de su clase base, se invocará automáticamente
a un constructor en la clase base sin parámetros.

Te expongo el siguiente ejemplo:

class Padre {
public Padre() { System.Console.WriteLine("Padre"); }
}

class Hijo : Padre {
public Hijo() { System.Console.WriteLine("Hijo"); }
}

class Nieto : Hijo {
public Nieto() { System.Console.WriteLine("Nieto"); }
}

La siguiente línea:
Nieto x = new Nieto();

provocará que se invoque primero el constructor en Padre, luego Hijo y
finalmente Nieto. Es decir, automáticamente se está convirtiendo:
public Hijo() { }
en
public Hijo() : base() { }



Otra prueba de ello, es que lo siguiente generará un error de compilación:

class Padre {
public Padre(int x) { } // No hay constructor sin parámetros!!
}

class Hijo : Padre {
public Hijo() { } // Padre no tiene constructor sin parámetros, esto no
compilará!!
}

error CS1501: Ninguna sobrecarga para el método 'Padre' acepta '0'
argumentos





Saludos,
Pedro Luna



"Alberto Poblacion"
escribió en el mensaje de
noticias:#
"Rolando" wrote in message
news:er2SW%
Si tengo estas clases:

public Class A
{
public A( ) {..}
}

public Class B : A
{
public B( ) {..}
}

al yo crear un objeto como este:

var obj=new B( );

se supone que me ejecuta solo el constructor de la clase B, o ejecuta
tambien el de la clase A?



Solo ejecuta el B. Si deseas ejecutar también el A (cosa que,
normalmente, casi siempre se debería hacer), la sintaxis es esta:

public Class B : A
{
public B():base() {..}
}




Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida