首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将基类强制转换为ISerializable

将基类强制转换为ISerializable
EN

Stack Overflow用户
提问于 2012-11-22 15:09:26
回答 2查看 244关注 0票数 0

我在子类和父类中都实现了ISerializable,如下所示:

代码语言:javascript
复制
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接口?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-22 15:14:52

就我个人而言,我不同意你链接的答案中提出的观点。显式接口实现更有问题,原因正如您所给出的:它真的不能很好地处理继承。

如果要重新实现已显式实现的接口,则无法在重新实现相同接口的类型的对象上调用该实现,包括从该重新实现的代码中调用。

有两个选项:

  • 改为使用隐式接口实现。就我个人而言,我通常觉得这很简单。我只在接口具有成员时才使用显式接口实现,而当您考虑使用显式接口实现的类itself.
  • Continue时,这些成员实际上没有任何意义,但使该实现只调用受保护的虚方法。然后,可以在派生类中重写该虚拟方法并调用基implementation.
票数 2
EN

Stack Overflow用户

发布于 2012-11-22 15:24:02

您不需要使用"base"关键字进行转换。实际上,您不能在此上下文中使用"base"关键字。如果您以隐式方式实现 "ISerializable" 接口,并且它将使用调用者实例的所有者调用父方法,则如果您希望使用"base.GetObjectData" 包含父方法,则只需调用基方法即可。

这个行为是面向对象模型中最简单的事情之一,你不能改变它。另一方面,您可以使用"virtual"关键字并尝试覆盖父方法(在这种情况下,我认为您不需要此方法)。

我认为你应该看看stackoverflow上的here,关于实现接口的方法有一些很好的答案。

此外,在MSDN here上有一本关于Polymorphism的完美手册。它将帮助你理解为什么你不能转换"base",你会发现一些技术可以用其他指定的方法来做到这一点。

我的想法:

使用"dynamic"关键字和"ExpandoObject"是创建动态模型并在其上执行序列化操作的更好方法。在我个人看来,它在许多情况下要快得多,而且实现起来也很简单。

希望能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13507456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档