Estoy haciendo mi constructores un poco más estricta mediante la eliminación de algunos de mis vacías de constructores. Soy bastante nuevo a la herencia, y estaba perplejo con el error que me dieron: de la Clase Base no Contiene Constructor sin parámetros. ¿Cómo puedo hacer A2 heredar de Una sin que exista un constructor vacío en A. También, por mi propia comprensión personal, ¿por qué A2, que requieren un constructor vacío para Una?

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

Class A2 : A{
    //The error appears here
}
  • usted no puede crear un objeto de una clase con ningún constructor. si usted no desea que el uno sin parámetros crear un constructor que acepta algunos parámetros.
  • Yo debería haber sido más claro en el OP, tanto de la clase a y A2 tienen constructores con parámetros, sólo quería quitar el sin parámetros, de manera que para crear una instancia de una clase, es necesario que todos los parámetros necesarios para que la clase de trabajo. Esto parece como la intuitiva cosa que hacer, esta es una manera inteligente de hacer las cosas?
InformationsquelleAutor sooprise | 2011-10-07

6 Comentarios

  1. 89

    En la clase A2, usted necesita para asegurarse de que todos los constructores de la llamada constructor de la clase base con parámetros.

    De lo contrario, el compilador asume que usted desea utilizar el sin parámetros base al constructor de la clase para construir Un objeto en el que el A2 objeto se basa.

    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
        }
    }
    • Nunca he visto esto antes, pero esto es exactamente lo que hizo el truco. Muchas gracias!
    • Resulta que usted puede ignorar el constructor sin parámetros si usted fija los otros constructores a base del uso de constructor con parámetros. I. E. la segunda definición en A2 es el único necesario.
    • Cierto! Pero cada constructor debe llamar explícitamente un constructor de la clase base si no hay ningún constructor sin parámetros de la clase base. Si la base no tiene constructor es especificado, el compilador intentará encontrar un constructor sin parámetros de la clase base.
    • Si estás tratando de hacer esto con la inyección de un registro, preocupación intersectorial problema se manejan mejor con una derivada de la clase base decorador o un observador registrador.
  2. 8

    Ejemplo:

    class A2 : A
    {
       A2() : base(0)
       {
       }
    }
    
    class A
    {
        A(int something)
        {
            ...
        }
    }
    • Es común y fácil de leer para poner la base de la clase de primero.
    • Es incluso más común para poner la base de la clase en un archivo diferente.
  3. 2

    Si la clase base no tiene un constructor sin parámetros, usted necesita llamar a uno de tu clase derivada utilizando base palabras clave:

    class A
    {
        public A(Foo bar)
        {
        }
    }
    
    class A2 : A
    {
        public A2()
            : base(new Foo())
        {
        }
    }
  4. 1

    Se ha a llamar a algunos constructor. El valor predeterminado es una llamada a base().

    También puede utilizar los métodos estáticos, literales, y los parámetros a la actual constructor en llamadas a 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))
            {
            }
        }
  5. 0

    cuando se crea el objeto de la clase derivada,a su constructor de la clase base se llama automáticamente.Así que en el momento de crear el objeto de clase derivada,y su objeto de clase derivada no ha constructor toma uno o más argumentos, no habrá nada para pasar al constructor de la clase base que quiere un argumento.
    así que para hacer eso, usted necesita para pasar algo al constructor de la clase base como sigue:

    Class A{
        //No empty constructor for A
        //Blah blah blah...
    }
    
    Class A2 : A{
        public A2():base(some parameter)
    }

Dejar respuesta

Please enter your comment!
Please enter your name here