Llamar al constructor base en C#
Si heredo de una clase base y quiero pasar algo del constructor de la clase heredada al constructor de la clase base, ¿cómo lo hago?
Por ejemplo,
Si heredo 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 poder pasar el mensaje string a la clase base Exception.
11 answers
Modifique su constructor a lo siguiente para que llame al 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 se puede llamar en cualquier momento dentro de un método. Esa es la razón por la que está recibiendo errores en su llamada en el cuerpo del constructor.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-15 07:48:56
Tenga en cuenta que puede usar métodos estáticos 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;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-31 17:17:17
Si necesita llamar al constructor base pero no de inmediato porque su nueva clase (derivada) necesita hacer alguna manipulación de datos, la mejor solución es recurrir al método factory. Lo que necesita hacer es marcar privado su constructor derivado, luego hacer un método estático en su clase que hará todo lo necesario y luego 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);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-07 20:52:07
public class MyExceptionClass : Exception
{
public MyExceptionClass(string message,
Exception innerException): base(message, innerException)
{
//other stuff here
}
}
Puede pasar la excepción interna a uno de los constructores.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-04 05:03:34
Es cierto usar el base
(algo) para llamar al constructor de la clase base, pero en caso de sobrecarga use 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-09 11:46:52
De Framework Design Guidelines y reglas FxCop.:
1. La excepción personalizada debe tener un nombre que termine con Exception
class MyException : Exception
2. La excepción debe ser pública
public class MyException : Exception
3. CA1032: Exception debería implementar constructores estándar.
- Un constructor público sin parámetros.
- Un constructor público con un argumento de cadena.
- Un constructor público con una cadena y una excepción (ya que puede envolver otra excepción).
-
Un constructor de serialización protegido si el tipo no está sellado y privado si el tipo está sellado. Basado en MSDN:
[Serializable()] public class MyException : Exception { public MyException() { // Add any type-specific logic, and supply the default message. } public MyException(string message): base(message) { // Add any type-specific logic. } public MyException(string message, Exception innerException): base (message, innerException) { // Add any type-specific logic for inner exceptions. } protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // Implement type-specific serialization constructor logic. } }
O
[Serializable()]
public sealed class MyException : Exception
{
public MyException()
{
// Add any type-specific logic, and supply the default message.
}
public MyException(string message): base(message)
{
// Add any type-specific logic.
}
public MyException(string message, Exception innerException):
base (message, innerException)
{
// Add any type-specific logic for inner exceptions.
}
private MyException(SerializationInfo info,
StreamingContext context) : base(info, context)
{
// Implement type-specific serialization constructor logic.
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-24 07:34:21
También puede hacer una comprobación condicional con parámetros en el constructor, lo que permite cierta flexibilidad.
public MyClass(object myObject=null): base(myObject ?? new myOtherObject())
{
}
O
public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject)
{
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-11 10:47:32
class Exception
{
public Exception(string message)
{
[...]
}
}
class MyExceptionClass : Exception
{
public MyExceptionClass(string message, string extraInfo)
: base(message)
{
[...]
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-26 04:11:37
public class MyException : Exception
{
public MyException() { }
public MyException(string msg) : base(msg) { }
public MyException(string msg, Exception inner) : base(msg, inner) { }
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-22 13:10:47
De acuerdo con algunas de las otras respuestas enumeradas aquí, puede pasar parámetros al constructor de clase base. Se recomienda llamar a su constructor de clase base al principio del constructor para su clase heredada.
public class MyException : Exception
{
public MyException(string message, string extraInfo) : base(message)
{
this.Message = $"{message} Extra info: {extraInfo}";
// You can omit the 'this.' portion above...
}
}
Observo que en su ejemplo nunca hizo uso del parámetro extraInfo
, por lo que asumí que podría querer concatenar el parámetro de cadena extraInfo
a la propiedad Message
de su excepción (parece que esto está siendo ignorado en la respuesta aceptada y el código en su pregunta).
Esto se logra simplemente invocando el constructor de clase base, y luego actualizando la propiedad Message con la información adicional.
Alternativamente, como la propiedad Message
se hereda de la clase base, ni siquiera tiene que llamar explícitamente al constructor de la clase base. Puedes simplemente actualizar la propiedad Message
directamente desde el constructor de tu clase heredada, así:
public class MyException : Exception
{
public MyException(string message, string extraInfo)
{
this.Message = $"{message} Extra info: {extraInfo}";
// You can omit the 'this.' portion above...
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-23 21:04:22
Usando base puedes llamar a constructor de clase base
class BaseClass
{
public BaseClass(int val)
{
Console.WriteLine($"{nameof(BaseClass) } constructor");
}
}
class DerivedClass : BaseClass
{
public DerivedClass() : base(10)
{
Console.WriteLine($"{nameof(DerivedClass) } constructor");
}
}
class Program
{
static void Main(string[] args)
{
BaseClass baseClass = new DerivedClass();
Console.ReadLine();
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-10 07:50:56