Todo tipo de datos ha de disponer
de al menos un constructor. Cuando se define un tipo sin especificar ninguno el
compilador considera que implícitamente se ha definido uno sin cuerpo ni parámetros de la siguiente forma:
public
<nombreClase>(): base()
{}
En el caso de que el tipo sea una
clase abstracta, entonces el constructor por defecto introducido es el que se
muestra a continuación, ya que el anterior no sería válido porque permitiría
crear objetos de la clase a la que pertenece:
protected
<nombreClase>(): base()
{}
En el momento en se defina
explícitamente algún constructor el compilador dejará de introducir
implícitamente el anterior. Hay que tener especial cuidado con la llamada que
este constructor por defecto realiza en su inicializador, pues pueden
producirse errores como el del siguiente ejemplo:
class A
{
public A(int x)
{}
}
class B:A
{
public static void
Main()
{
B
b = new B(); // Error: No hay
constructor base
}
}
En este caso, la creación del
objeto de clase B en Main() no es posible debido a que el constructor que
por defecto el compilador crea para la clase B
llama al constructor sin parámetros de su clase base A,
pero A carece de dicho constructor
porque no se le ha definido explícitamente ninguno con esas características
pero se le ha definido otro que ha hecho que el compilador no le defina
implícitamente el primero.
Otro error que podría darse
consistiría en que aunque el tipo padre tuviese un constructor sin parámetros,
éste fuese privado y por tanto inaccesible para el tipo hijo.
También es importante señalar que
aún en el caso de que definamos nuestras propios constructores, si no
especificamos un inicializador el compilador introducirá por nosotros uno de la
forma :base() Por tanto, en estos
casos también hay que asegurarse de que el tipo donde se haya definido el
constructor herede de otro que tenga un constructor sin parámetros no privado.