No llamar al constructor de la clase base

19/01/2007 - 12:18 por emiliano.sutil | Informe spam
Hola a todos

Tengo un problemilla que me tiene un poco perplejo.

He leido que en C# cuando instancias un objeto de una clase, siempre
se llama al constructor de la clase base antes de lanzar el contructor
de la clase en cuestión.

¿Es eso correcto? mas que nada porque tengo una clase que hereda de
otra, pero no quiero que al instanciarla se llame al constructor del
ancestor.

¿Es eso posible? o estoy metiendo la pata en algún lado.

Un saludo

Emi

Preguntas similare

Leer las respuestas

#1 Roberto M. Oliva
19/01/2007 - 12:51 | Informe spam
Hola

No entiendo el motivo por el que no necesitas llamar al constructor de
la clase base.
El plantemiento que comentas desenboca en que una de las dos clases
esta mal diseñada.
Si heredas de una clase es obligatorio llamar al constructor (a uno de
ellos si tiene varios). La clase base define el estado inicial de todas
las clases de su tipo, sino no tiene mucho sentido la herencia...

Saludos
Roberto M. Oliva


ha escrito:

Hola a todos

Tengo un problemilla que me tiene un poco perplejo.

He leido que en C# cuando instancias un objeto de una clase, siempre
se llama al constructor de la clase base antes de lanzar el contructor
de la clase en cuestión.

¿Es eso correcto? mas que nada porque tengo una clase que hereda de
otra, pero no quiero que al instanciarla se llame al constructor del
ancestor.

¿Es eso posible? o estoy metiendo la pata en algún lado.

Un saludo

Emi
Respuesta Responder a este mensaje
#2 emiliano.sutil
19/01/2007 - 13:16 | Informe spam
On 19 ene, 12:51, "Roberto M. Oliva" wrote:
Hola




Hola.


No entiendo el motivo por el que no necesitas llamar al constructor de
la clase base.



Pues porque en ella por ejemplo instancio un objeto de un tipo que no
es valido para las clases hijas.

El plantemiento que comentas desenboca en que una de las dos clases
esta mal diseñada.



Eso me temo. Ya estoy trabajando en el cambio de diseño, pero te
cuento el problema inicial

Si heredas de una clase es obligatorio llamar al constructor (a uno de
ellos si tiene varios). La clase base define el estado inicial de todas
las clases de su tipo, sino no tiene mucho sentido la herencia...



Te cuento.

Tengo en el ancestor un campo de tipoX, tengo una clase que hereda de
tipoX, pongamos tipoY.
Pues bien en el ancestor instancio un objeto tipoX y en la clase base
lo que hago es instanciar un objeto de tipoY, pero claro,
como se me llama al ancestor antes que a la clase en cuestion resulta
que se me instancia un objeto tipoX cuando yo lo que quiero
es un tipoY.

Es decir uso el constructor para instanciar el tipo correcto para ese
campo para cada clase, pero como se me llama al ancestor me ha
fastidiado el sistema.

No se si me he explicado.

De hecho yo pensaba que para que se llamara al ancestor habia que
llamarlo explicitamente usando base()

pero va a ser que no.



Saludos
Roberto M. Oliva




Emiliano Sutil
Respuesta Responder a este mensaje
#3 Octavio Hernandez
19/01/2007 - 13:21 | Informe spam
Tengo una clase que hereda de otra, pero no quiero que al instanciarla




se llame al constructor del ancestor.

Si hay algo que quieras hacer de manera opcional en la clase base, una
posible
solución podría ser agregar en la clase base un constructor con un parámetro
lógico, y desde las clases hijas llamar explícitamente a ese constructor con
un
valor adecuado de pendiendo de si quieres ejecutar o no esas sentencias:

class ClaseBase
{
public ClaseBase(bool ejecutarAcciones)
{
if (ejecutarAcciones)
{
// ejecutar las acciones opcionales
}
}
}

class ClaseHijaNoEjecutaAcciones: ClaseBase
{
// llamada explícita al constructor de la clase base con arg. adecuado
public ClaseHijaNoEjecutaAcciones(): base(false)
{
}
}

En todo caso, ten en cuenta que todo objeto de la clase heredera contiene
campos heredado de su ancestro, y debes garantizar su correcta
inicialización.

Slds - Octavio
Respuesta Responder a este mensaje
#4 Roberto M. Oliva
19/01/2007 - 14:17 | Informe spam
Hola!!

Tengo en el ancestor un campo de tipoX, tengo una clase que hereda de
tipoX, pongamos tipoY.
Pues bien en el ancestor instancio un objeto tipoX y en la clase base
lo que hago es instanciar un objeto de tipoY, pero claro,
como se me llama al ancestor antes que a la clase en cuestion resulta
que se me instancia un objeto tipoX cuando yo lo que quiero
es un tipoY.



No se si he entendido bien la cuestion, pero por lo que entiendo tienes
algo asi:

class Ancestor
{
protected tipoX _objeto;
public Ancestor()
{
_objeto = new tipoX:
}
}

class Base : Ancestor
{
public Base() : base()
{
// Te ha creado un _objeto de tipo tipoX, cuando tu lo querias
de tipoY.
}
}

class tipoY : tipoX
{
}

Lo que pasa es que en Base quieres instanciar _objeto que sea tipoY y
no tipoX. A bote pronto, por que no lo haces asi? :

class Ancestor
{
protected tipoX _objeto;
public Ancestor()
{
_objeto = new tipoX:
}
public Ancestor(tipoX nuevo_objeto)
{
_objeto = nuevo_objeto:
}
}

class Base : Ancestor
{
public Base() : base(new tipoY())
{
}
}

Ya tendrias en Ancestor::_objeto un objeto de tipoY.

Espero que te ayude
Saludos
Roberto M. Oliva


ha escrito:

On 19 ene, 12:51, "Roberto M. Oliva" wrote:
> Hola
>

Hola.


> No entiendo el motivo por el que no necesitas llamar al constructor de
> la clase base.

Pues porque en ella por ejemplo instancio un objeto de un tipo que no
es valido para las clases hijas.

> El plantemiento que comentas desenboca en que una de las dos clases
> esta mal diseñada.

Eso me temo. Ya estoy trabajando en el cambio de diseño, pero te
cuento el problema inicial

> Si heredas de una clase es obligatorio llamar al constructor (a uno de
> ellos si tiene varios). La clase base define el estado inicial de todas
> las clases de su tipo, sino no tiene mucho sentido la herencia...

Te cuento.

Tengo en el ancestor un campo de tipoX, tengo una clase que hereda de
tipoX, pongamos tipoY.
Pues bien en el ancestor instancio un objeto tipoX y en la clase base
lo que hago es instanciar un objeto de tipoY, pero claro,
como se me llama al ancestor antes que a la clase en cuestion resulta
que se me instancia un objeto tipoX cuando yo lo que quiero
es un tipoY.

Es decir uso el constructor para instanciar el tipo correcto para ese
campo para cada clase, pero como se me llama al ancestor me ha
fastidiado el sistema.

No se si me he explicado.

De hecho yo pensaba que para que se llamara al ancestor habia que
llamarlo explicitamente usando base()

pero va a ser que no.


>
> Saludos
> Roberto M. Oliva
>

Emiliano Sutil
Respuesta Responder a este mensaje
#5 emiliano.sutil
20/01/2007 - 11:04 | Informe spam
Hola,

Pues si eso que comentas es un sistema, pero se me ha ocurrido algo:

Lo que he hecho ha sido extraer esa inicializacion a un metodo virtual
y sobreescribirlo en la clase hija de manera que ahora, aunque se
llama al ancestor, al llamar a la inicializacion de parametros, se
llama al metodo sobreescrito en clase hija, en vez de a al de la clase
padre

más aun como extraje ese
codigo distinto se me quedaron los 2 constructores iguales, asi que
eliminé el constructor de la clase hija. ¡ Que gran ejemplo del
refactoring en acción y sin
quererlo!

Un saludo

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