如果我继承了一个基类,并想从继承类的构造函数中传递一些东西给基类的构造函数,我该怎么做?
比如说。
如果我继承自Exception类,我想做这样的事情。
class MyExceptionClass : Exception
{
public MyExceptionClass(string message, string extraInfo)
{
//This is where it's all falling apart
base(message);
}
}
基本上我想要的是能够将字符串信息传递给基础的Exception类。
请注意,你可以在调用基础构造函数时使用静态方法。
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"(something)来调用基类构造函数,但如果是重载,则使用 "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
来自[框架设计指南][1]和FxCop规则。
1. 自定义Exception的名称应以Exception结尾。
class MyException : Exception
2. 例外情况应是公开的
public class MyException : Exception
3. [CA1032。 [CA1032:异常情况应执行标准构造函数][2]。
[Serializable()] public class MyException : 异常 { 公开的MyException() { // 添加任何特定类型的逻辑,并提供默认信息。 }
public MyException(string message): base(message) { // 添加任何特定类型的逻辑。 } public MyException(string message, Exception innerException)。 base (message, innerException) { // 为内部异常添加任何特定类型的逻辑。 } 保护MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // 实现特定类型的序列化构造逻辑。 } }
或
[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.
}
}
[1]: https://books.google.co.th/books?id=39d1wZ598ecC&pg=PT394&lpg=PT394&dq=exception%20fxcop&source=bl&otts=bO6nGDVi4f&sig=DFZ7ucCPK__LvIzTVaTSZ2rlXpY&hl=fr&sa=X&ved=0ahUKEwi88-qO9MHKAhUPH44KHVmdCh8Q6AEIUDAG#v=onepage&q=exception%20fxcop&f=false。 [2]: https://msdn.microsoft.com/en-us/library/ms182151.aspx
根据这里列出的一些其他答案,你可以将参数传递到基类构造函数中。 建议在继承类的构造函数开始时调用基类构造函数。
public class MyException : Exception
{
public MyException(string message, string extraInfo) : base(message)
{
}
}
我注意到,在你的例子中,你从来没有使用extraInfo
参数,所以我认为你可能想把extraInfo
字符串参数连接到异常的Message
属性中(似乎在你的问题中,接受的答案和代码都忽略了这一点)。
这可以通过调用基类构造函数,然后用额外的信息更新 Message 属性来实现。
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) { }
}