如果我从一个基类继承并希望将继承类的构造函数中的某些东西传递给基类的构造函数,我该怎么做?
例如,
如果我从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); } }
确实使用base
(某些)来调用基类构造函数,但是在重载的情况下使用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
public class MyExceptionClass : Exception { public MyExceptionClass(string message, Exception innerException): base(message, innerException) { //other stuff here } }
您可以将内部异常传递给其中一个构造函数.
来自框架设计指南和FxCop规则.:
1.自定义异常的名称应以Exception结尾
class MyException : Exception
2.例外应该是公开的
public class MyException : Exception
3. CA1032:异常应该实现标准构造函数.
公共无参数构造函数.
具有一个字符串参数的公共构造函数.
一个带有一个字符串和Exception的公共构造函数(因为它可以包装另一个Exception).
序列化构造函数在类型未密封时受到保护,如果类型被密封则为私有.基于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(string message, string extraInfo) : base(message) { } }
我注意到在您的示例中您从未使用过该extraInfo
参数,因此我假设您可能希望将extraInfo
字符串参数连接到Message
异常的属性(似乎在接受的答案和问题中的代码中忽略了这一点) .
这可以通过调用基类构造函数,然后使用额外信息更新Message属性来实现.
或者,由于extraInfo
属性是从基类继承的,因此您甚至不必显式调用基类构造函数.您可以extraInfo
直接从继承类的构造函数更新属性,如下所示:
public class MyException: Exception { public MyException(string message, string extraInfo) : base($"{message} Extra info: {extraInfo}") { } }
public class MyException : Exception { public MyException() { } public MyException(string msg) : base(msg) { } public MyException(string msg, Exception inner) : base(msg, inner) { } }