657 votos

De llamadas de constructor base en c#

Si he de heredar de una clase base y desea pasar algo desde el constructor de la clase heredada al constructor de la clase base, ¿cómo lo hago?

Por ejemplo,

Si me heredar de la clase Exception quiero hacer algo como esto:

class MyExceptionClass : Exception
{
     public MyExceptionClass(string message, string extraInfo)
     {
         //This is where it's all falling apart
         base(message);
     }
}

Básicamente lo que quiero es ser capaz de pasar el mensaje de cadena para la base de la clase de Excepción

865voto

Jon Limjap Puntos 46429

Modificar el constructor a la siguiente, de modo que las llamadas de constructor de la clase base correctamente:

public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message, string extrainfo) : base(message)
    {
        //other stuff here
    }
}

Tenga en cuenta que un constructor no es algo que usted puede llamar en cualquier momento dentro de un método. Esa es la razón de que usted está recibiendo errores en su llamada en el cuerpo del constructor.

299voto

Axl Puntos 3077

Tenga en cuenta que usted puede utilizar estática métodos dentro de la llamada al constructor base...

    class MyExceptionClass : Exception
    {
         public MyExceptionClass(string message, string extraInfo) : 
         base(ModifyMessage(message, extraInfo))
         {
         }

         private static string ModifyMessage(string message, string extraInfo)
         {
             Trace.WriteLine("message was " + message);
             return message.ToLowerInvariant() + Environment.NewLine + extraInfo;
         }
    }

45voto

armanali Puntos 875

Si necesita llamar al constructor base, pero no de inmediato, porque su nuevo (derivados) las necesidades de la clase para hacer algunas de manipulación de datos, la mejor solución es recurrir al método de fábrica. Lo que usted necesita hacer es marcar privado de su derivada constructor, a continuación, hacer un método estático en la clase que va a hacer todas las cosas necesarias y después de llamar al constructor y devolver el objeto.

public class MyClass : BaseClass
{
    private MyClass(string someString) : base(someString)
    {
        //your code goes in here
    }

    public static MyClass FactoryMethod(string someString)
    {
        //whatever you want to do with your string before passing it in
        return new MyClass(someString);
    }
}

17voto

SnowBEE Puntos 465
public class MyExceptionClass : Exception
{
    public MyExceptionClass(string message,
      Exception innerException): base(message, innerException)
    {
        //other stuff here
    }
}

Usted puede pasar interior de excepción a uno de los constructores.

9voto

Janus Pedersen Puntos 29

Es cierto que el uso de la base (algo) a la llamada de constructor de la clase base, pero en el caso de la sobrecarga de uso de la palabra clave this

public ClassName() : this(par1,par2)
{
// do not call the constructor it is called in the this.
// the base key- word is used to call a inherited constructor   
} 

// Hint used overload as often as needed do not write the same code 2 or more times

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X