2011-10-07 21 views
42

Estoy haciendo que mis constructores sean un poco más estrictos al eliminar algunos de mis constructores vacíos. Soy bastante nuevo en la herencia y me quedé perplejo con el error que obtuve: la clase base no contiene el constructor sin parámetros. ¿Cómo puedo hacer que A2 herede de A sin que exista un constructor vacío en A. Además, para mi comprensión personal, ¿por qué A2 requiere un constructor vacío para A?La clase base no contiene el constructor sin parámetros?

Class A{ 
    //No empty constructor for A 
    //Blah blah blah... 
} 

Class A2 : A{ 
    //The error appears here 
} 
+2

no se puede crear un objeto de una clase con ningún constructor. si no desea que el parámetro cree un constructor que acepte algunos parámetros. –

+0

Debería haber sido más claro en el OP, tanto la clase A como la A2 tienen constructores con parámetros, solo quería eliminar los parámetros para que para crear una instancia de una clase, necesite todos los parámetros necesarios para la clase. trabajo. Esto parece lo más intuitivo, ¿es esta una forma inteligente de hacer las cosas? – sooprise

Respuesta

78

En la clase A2, es necesario asegurarse de que todos los constructores llaman el constructor de la clase base con parámetros.

De lo contrario, el compilador supondrá que desea utilizar el constructor de clase base sin parámetros para construir el objeto A en el que se basa su objeto A2.

Ejemplo:

class A 
{ 
    public A(int x, int y) 
    { 
     // do something 
    } 
} 

class A2 : A 
{ 
    public A2() : base(1, 5) 
    { 
     // do something 
    } 

    public A2(int x, int y) : base(x, y) 
    { 
     // do something 
    } 

    // This would not compile: 
    public A2(int x, int y) 
    { 
     // the compiler will look for a constructor A(), which doesn't exist 
    } 
} 
+2

Nunca había visto esto antes, pero esto es exactamente lo que hizo el truco. Muchas gracias! – sooprise

+0

Resulta que puede ignorar el constructor sin parámetros si establece que los otros constructores usen el constructor base con params. ES DECIR. la segunda definición en A2 es la única requerida. – Tyeth

+0

@Tyeth ¡Es cierto! Pero cada constructor debe llamar explícitamente a un constructor de clase base si no hay un constructor sin parámetros en la clase base. Si no se especifica ningún constructor base, el compilador intentará encontrar un constructor sin parámetros en la clase base. –

2

Si su clase base no tiene un constructor sin parámetros, es necesario llamar a uno de su clase derivada utilizando base palabra clave:

class A 
{ 
    public A(Foo bar) 
    { 
    } 
} 

class A2 : A 
{ 
    public A2() 
     : base(new Foo()) 
    { 
    } 
} 
8

Ejemplo:

class A2 : A 
{ 
    A2() : base(0) 
    { 
    } 
} 

class A 
{ 
    A(int something) 
    { 
     ... 
    } 
} 
+0

Es común y más fácil de leer para poner primero la clase base. –

+1

Es incluso más común poner la clase base en un archivo diferente. – Joe

1

tiene para llamar algún constructor El valor predeterminado es una llamada al base().

También puede usar métodos estáticos, literales y cualquier parámetro para el constructor actual en las llamadas al base().

public static class MyStaticClass 
    { 
     public static int DoIntWork(string i) 
     { 
      //for example only 
      return 0; 
     } 
    } 

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

    public class B : A 
    { 
     public B(string x) : base(MyStaticClass.DoIntWork(x)) 
     { 
     } 
    } 
0

Porque si A no tiene constructor por defecto, entonces el constructor del A2 tiene que llamar a la base() con los argumentos al constructor de A. Ver esta pregunta: Calling the base constructor in C#

0

cuando se crea el objeto de su derivada, el constructor de su clase base se llama automáticamente. Así que en el momento que crea su objeto de clase derivado, y su objeto de clase derivado no tiene uno o más argumentos, no habrá nada que pasar al constructor de la clase base que quiera uno argumento. manera de hacer eso, tiene que pasar algo para el constructor de la clase base de la siguiente manera:

Class A{ 
    //No empty constructor for A 
    //Blah blah blah... 
} 

Class A2 : A{ 
    public A2():base(some parameter) 
} 
Cuestiones relacionadas