我在子类和父类中都实现了ISerializable,如下所示:
class CircuitElement : ISerializable
{
...
protected void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info == null)
throw new ArgumentNullException("info");
info.AddValue("ID", ID);
}
}
class Bus : CircuitElement, ISerializable
{
...
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
if (info == null)
throw new ArgumentNullException("info");
((ISerializable)base).GetObjectData(info,context);
info.AddValue("Voltage", Voltage);
info.AddValue("BaseVoltage", BaseVoltage);
info.AddValue("Location", Location);
}
}
但在子课程Bus
中,我收到错误Use of keyword base is not valid in this context
。我知道我可以隐式地在父CircuitElement
类上实现接口,然后我不必担心转换,但是认为显式实现更适合这种情况(原因类似)对于这里介绍的人:https://stackoverflow.com/a/143425/996592)
有没有办法进行转换,还是我无法隐式地在父类中实现ISerializable
接口?
答案 0 :(得分:2)
就个人而言,我不同意您所关注答案中提出的观点。显式接口实现只是更有问题,因为完全你给出的原因:它实际上不能很好地继承。
如果您正在重新实现已明确实现的接口,那么只有无法在类型的对象上调用该实现,该对象重新实现相同的接口,包括来自该代码的代码重新实现。
两个选项:
改为使用隐式接口实现。就个人而言,我通常觉得这个更简单。我只使用显式接口实现,当接口具有在您考虑类本身时没有意义的成员时。
继续使用显式接口实现,但要使该实现只是调用受保护的虚方法。然后,您可以在派生类中覆盖该虚方法,并调用基本实现。
答案 1 :(得分:1)
您不需要使用"base"
关键字进行转换。实际上,您无法在此上下文中使用"base"
关键字。如果您希望使用"base.GetObjectData"
包含父信息,如果您以隐式方式实现"ISerializable"
接口,则应该调用基本方法,并且它将与所有者一起调用父方法调用者实例。
这种行为是面向对象模型中的一个简单的事情,你无法改变它。另一方面,您可以使用"virtual"
关键字并尝试覆盖父方法(在这种情况下,我不认为您需要此方法)。
我认为你应该看一下stackoverflow上的here,关于实现接口的方法有一些很好的答案。
在MSDN here上还有一本关于多态性的完美手册。它将帮助您理解为什么您可以转换"base"
,并且您会发现一些技术可以用其他指定的方式来完成。
我的想法:
使用"dynamic"
关键字和"ExpandoObject"
更适合创建动态模型并对其进行序列化处理。我个人认为,在许多情况下它的速度要快得多,而且实施起来也很简单。
希望有所帮助。