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

#6 Alberto Poblacion
04/01/2008 - 17:14 | Informe spam
"Pedro Luna Montalvo" wrote in message
news:
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.




Tienes toda la razón. Estaba pensando en el constructor CON parámetros,
y de hecho estuve a punto de poner parámetros en el ejemplo, pero al final
no los puse, por simplificar, con lo que quedó precisamente el caso en el
que no era aplicable lo dicho.
Respuesta Responder a este mensaje
#7 Pedro Luna Montalvo
04/01/2008 - 18:59 | Informe spam
Saludos,

Exactamente.

si tienes un formulario padre, y un formulario hijo que hereda del anterior,
así:

class MiFormPadre : Form {
public MiFormPadre() {
InitializeComponent()
}
private void InitializeComponent() { }
}

class MiFormHijo : MiFormPadre {
public MiFormHijo() {
InitializeComponent()
}
private void InitializeComponent() { }
}

Cuando se crea una instancia del formulario hijo, primero se invoca al
constructor sin parametros de la clase padre, es decir, se ejecuta el método
InitializeComponent de la clase padre. Posterior a eso, se ejecutará el
constructor de la clase hijo, es decir, el método InitializeComponent de
esta clase hijo.

En resumen, se ejecutan tanto los métodos InitializeComponent de la clase
padre como la clase hijo, en ese orden.

saludos,
Pedro Luna


"Josias" <josias> escribió en el mensaje de
noticias:
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
#8 Josias
04/01/2008 - 19:36 | Informe spam
Gracias reiteradas Pedro por tus excelentes respuestas.



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

Exactamente.

si tienes un formulario padre, y un formulario hijo que hereda del
anterior, así:

class MiFormPadre : Form {
public MiFormPadre() {
InitializeComponent()
}
private void InitializeComponent() { }
}

class MiFormHijo : MiFormPadre {
public MiFormHijo() {
InitializeComponent()
}
private void InitializeComponent() { }
}

Cuando se crea una instancia del formulario hijo, primero se invoca al
constructor sin parametros de la clase padre, es decir, se ejecuta el
método InitializeComponent de la clase padre. Posterior a eso, se
ejecutará el constructor de la clase hijo, es decir, el método
InitializeComponent de esta clase hijo.

En resumen, se ejecutan tanto los métodos InitializeComponent de la clase
padre como la clase hijo, en ese orden.

saludos,
Pedro Luna


"Josias" <josias> escribió en el mensaje de
noticias:
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
#9 Rolando
04/01/2008 - 20:06 | Informe spam
De paso tu pregunta y las respuestas me aclararon bastante mas esas dudas
relacionadas que tenía.
La verdad que aqui se aprende bastante o por lo menos los novatos no estamos
desamparados en este mundo tan complicado que es el .Net.
Gracias a todos.

"Josias" <josias> escribió en el mensaje
news:
Gracias reiteradas Pedro por tus excelentes respuestas.



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

Exactamente.

si tienes un formulario padre, y un formulario hijo que hereda del
anterior, así:

class MiFormPadre : Form {
public MiFormPadre() {
InitializeComponent()
}
private void InitializeComponent() { }
}

class MiFormHijo : MiFormPadre {
public MiFormHijo() {
InitializeComponent()
}
private void InitializeComponent() { }
}

Cuando se crea una instancia del formulario hijo, primero se invoca al
constructor sin parametros de la clase padre, es decir, se ejecuta el
método InitializeComponent de la clase padre. Posterior a eso, se
ejecutará el constructor de la clase hijo, es decir, el método
InitializeComponent de esta clase hijo.

En resumen, se ejecutan tanto los métodos InitializeComponent de la clase
padre como la clase hijo, en ese orden.

saludos,
Pedro Luna


"Josias" <josias> escribió en el mensaje de
noticias:
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
#10 Josias
05/01/2008 - 02:13 | Informe spam
en este mundo tan complicado que es el .Net.




Tienes la razon, antes todo era mas facil :) pero a aprender! que no queda
de otra.


Josias
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida