关于.NET抽象类SoapHeader构造函数及派生类实现的报错咨询
关于SoapHeader派生类构造函数的问题解答
第一问:为什么抽象类SoapHeader可以这样声明构造函数?
这其实是C#里外部实现成员的特性。SoapHeader是.NET类库提供的抽象类,它的protected SoapHeader();构造函数并不是真的没有实现——只是它的实现体藏在.NET类库的内部(比如CLR或者框架原生代码里),对外公开的元数据里只显示声明部分,用分号代替方法体。
另外要注意两个关键点:
- 抽象类的构造函数本身不能被直接实例化调用,只能由派生类的构造函数通过
base()触发,所以它用protected修饰符限制只有派生类能访问。 - 这种无体的声明只适用于由外部(类库、CLR)提供实现的成员,我们自己写的普通非抽象类,绝对不能这么用。
第二问:为什么我的派生类构造函数会报错?
你遇到的constructor must contain body because it is not abstract错误,核心原因是:你自定义的派生类不是抽象类,却给构造函数写了无体的声明。
具体来说,你写的public AthenticationHeader();这种写法,只有当类是抽象类,或者该成员是外部实现时才合法。但你的AuthenticationSoapHeader是普通非抽象类,必须给构造函数加上方法体——哪怕是空的也没问题。
顺便纠正几个小问题:
- 拼写错误:
Athentication应该是Authentication,类名和构造函数名都要统一修正。 - 实现
ISerializable接口时,必须补充两个关键成员:GetObjectData方法,以及带SerializationInfo和StreamingContext参数的序列化构造函数,这俩都得有方法体。 - 带参数的构造函数
public AthenticationHeader(param1, param2),需要补充参数类型,并且加上方法体处理初始化逻辑。
修正后的示例代码如下:
[Serializable] public class AuthenticationSoapHeader : SoapHeader, ISerializable { // 无参构造函数,添加空方法体 public AuthenticationSoapHeader() { } // 带参数构造函数,补充类型和实现逻辑 public AuthenticationSoapHeader(string userName, string token) { // 这里写参数初始化逻辑,比如给类成员赋值 } // ISerializable要求的序列化方法 public void GetObjectData(SerializationInfo info, StreamingContext context) { // 实现序列化逻辑,比如把成员写入info } // 序列化构造函数,反序列化时会用到 protected AuthenticationSoapHeader(SerializationInfo info, StreamingContext context) { // 实现反序列化逻辑,从info中读取数据赋值给成员 } }
这样修改后,错误应该就会消失了。
内容的提问来源于stack exchange,提问作者kogibail
相关产品推荐
相关产品推荐

