2012-02-28 11 views
5

Tengo un conjunto de clases donde mi base tiene un constructor que toma un objeto de configuración y maneja la transferencia de los valores a sus propiedades.Llamar implícitamente a los constructores principales

abstract class A { public A(ObjType MyObj){} } 
abstract class B : A {} 
class C : A {} 
class D : B {} 
class E : B {} 

¿Es posible llamar a un constructor implícitamente base no por defecto de las clases hijas o qué necesitaría para poner en práctica de manera explícita la firma en la cadena de hacerlo a través de los constructores?

abstract class A { public A(ObjType MyObj){} } 
abstract class B : A { public A(ObjType MyObj) : base(MyObj){} } 
class C : A { public A(ObjType MyObj) : base(MyObj){} } 
class D : B { public A(ObjType MyObj) : base(MyObj){} } 
class E : B { public A(ObjType MyObj) : base(MyObj){} } 

Si ese es el caso, ¿es mejor que simplemente poner en práctica un método en la base y luego mi fábrica de llamar inmediatamente el método después de crear el objeto?

Respuesta

4

implícitamente? No, los constructores no son heredados. Su clase puede explícitamente llamar al es el constructor de sus padres. Pero si desea que su clase tenga las mismas firmas de constructor que la clase principal, debe implementarlas.

Por ejemplo:

public class A 
{ 
    public A(int someNumber) 
    { 
    } 
} 

// This will not compile becase A doesn't have a default constructor and B 
// doesn't inherit A's constructors. 
public class B : A 
{ 
} 

Para hacer este trabajo que tendría que declarar explícitamente los constructores que quieran B a tener, y tienen los llaman constructores de A explícitamente (a menos que A tiene un constructor por defecto, por supuesto) .

public class B : A 
{ 
    public B(int someNumber) : base(someNumber) 
    { 
    } 
} 
+0

Eso fue lo que temí (modestamente). Creo que iré por la ruta del método auxiliar. ¡Gracias! –

1

No, no es posible llamar a un constructor base no predeterminado implícitamente, usted tiene que hacerlo explícito.

1

Tiene que implementarlo explícitamente en la cadena. Además, importante, en su código original, no podrá llamar a new B(), ya que A no tiene un constructor predeterminado, y B no llama al constructor A que tiene una arg.

+0

Gracias y lo siento, omití el constructor predeterminado para abreviar. –

Cuestiones relacionadas