我在子类和父类中都实现了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接口?
发布于 2012-11-22 15:14:52
就我个人而言,我不同意你链接的答案中提出的观点。显式接口实现更有问题,原因正如您所给出的:它真的不能很好地处理继承。
如果要重新实现已显式实现的接口,则无法在重新实现相同接口的类型的对象上调用该实现,包括从该重新实现的代码中调用。
有两个选项:
发布于 2012-11-22 15:24:02
您不需要使用"base"关键字进行转换。实际上,您不能在此上下文中使用"base"关键字。如果您以隐式方式实现 "ISerializable" 接口,并且它将使用调用者实例的所有者调用父方法,则如果您希望使用"base.GetObjectData" 包含父方法,则只需调用基方法即可。
这个行为是面向对象模型中最简单的事情之一,你不能改变它。另一方面,您可以使用"virtual"关键字并尝试覆盖父方法(在这种情况下,我认为您不需要此方法)。
我认为你应该看看stackoverflow上的here,关于实现接口的方法有一些很好的答案。
此外,在MSDN here上有一本关于Polymorphism的完美手册。它将帮助你理解为什么你不能转换"base",你会发现一些技术可以用其他指定的方法来做到这一点。
我的想法:
使用"dynamic"关键字和"ExpandoObject"是创建动态模型并在其上执行序列化操作的更好方法。在我个人看来,它在许多情况下要快得多,而且实现起来也很简单。
希望能有所帮助。
https://stackoverflow.com/questions/13507456
复制相似问题