在C#中调用基础构造函数
如果我从一个基类继承,并希望从继承类的构造函数传递给基类的构造函数,我该怎么做?
例如,
如果我从Exception类继承我想要做这样的事情:
class MyExceptionClass : Exception { public MyExceptionClass(string message, string extraInfo) { //This is where it's all falling apart base(message); } }
基本上我想要的是能够将字符串消息传递给基类Exception类。
将您的构造函数修改为以下内容,以便正确调用基类构造函数:
public class MyExceptionClass : Exception { public MyExceptionClass(string message, string extrainfo) : base(message) { //other stuff here } }
请注意,构造函数不是您可以随时调用某个方法的东西。 这就是在构造函数体中调用错误的原因。
请注意,您可以在对基础构造函数的调用中使用静态方法。
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; } }
如果您需要调用基础构造函数,但不是马上就要完成,因为您的新(派生)类需要执行一些数据操作,所以最好的解决方案是使用工厂方法。 你需要做的是标记私人你的派生构造函数,然后在你的类中做一个静态方法将做所有必要的东西,然后调用构造函数并返回对象。
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); } }
public class MyExceptionClass : Exception { public MyExceptionClass(string message, Exception innerException): base(message, innerException) { //other stuff here } }
您可以将内部异常传递给其中一个构造函数。
这是真的使用基地(东西)来调用基类的构造函数,但在重载的情况下使用这个关键字
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
从框架设计指南和FxCop规则。 :
1.自定义异常应该有一个以异常结束的名称
class MyException : Exception
2.例外应该是公开的
public class MyException : Exception
3. CA1032:异常应该执行标准的构造函数。
- 一个公共无参数的构造函数。
- 带有一个字符串参数的公共构造函数。
- 具有一个字符串和异常的公共构造函数(因为它可以包装另一个异常)。
-
一个序列化构造函数在类型不封闭的情况下受到保护,如果类型是封闭的,则是私有的。 基于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. } }
要么
[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. } }
你也可以做一个有条件的检查,并在构造函数中传递属性,这样可以有一定的灵活性。
public MyClass(object myObject=null): base(myObject ?? new myOtherObject()) { }
要么
public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject) { }
class Exception { public Exception(string message) { [...] } } class MyExceptionClass : Exception { public MyExceptionClass(string message, string extraInfo) : base(message) { [...] } }
public class MyException : Exception { public MyException() { } public MyException(string msg) : base(msg) { } public MyException(string msg, Exception inner) : base(msg, inner) { } }
根据这里列出的其他答案,您可以将参数传递给基类构造函数。 建议在继承类的构造函数的开始处调用基类构造函数。
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... } }
我注意到,在你的例子中,你从来没有使用extraInfo
参数,所以我认为你可能想连接extraInfo
字符串参数到你的异常的Message
属性(似乎这是被忽略的接受的答案和代码你的问题)。
这只需调用基类构造函数,然后使用额外的信息更新Message属性即可实现。
或者,由于Message
属性是从基类继承的,所以您甚至不必显式地调用基类构造函数。 您可以直接从继承类的构造函数更新Message
属性,如下所示:
public class MyException : Exception { public MyException(string message, string extraInfo) { this.Message = $"{message} Extra info: {extraInfo}"; // You can omit the 'this.' portion above... } }