【问题标题】:Multiple Interface Inheritence without using Interfaces不使用接口的多接口继承
【发布时间】:2010-11-30 06:53:09
【问题描述】:

是的,标题没有多大意义,但这是我的情况。

我有两个接口,比如 IGen 和 ITrans。我的一些类实现了 IGen,一些实现了 ITrans,一些实现了两者

ITrans 有一种方法(翻译),而 IGen 有一种方法(生成)。对于同时实现 ITrans 和 IGen Generate 的类只需调用 Translate。

我还有一个接口 IGenAndTrans,它被简单地定义为

public interface IGenAndTrans : IGen , ITrans
{        
}

我有一个类(称为 Holder),它具有 IGenAndTrans 作为属性。

[Serializable] //<- Problem
public class Holder
{
    public IGenAndTrans GeneratorAndTranslator { get; set;}
}

现在,我想用 [SerializableAttribute] 标记类 Holder 并使用 XmlSerializer。 但是我不能这样做,因为 Holder 有一个接口属性。通常推荐的方法是使 IGenAndTrans 成为一个抽象基类并使用 XmlInclude。我过去成功地做到了这一点。

但是我不确定在这种情况下如何做到这一点。因为我的很多类都实现了 IGen 和 ITrans,所以它们不能简单地从抽象基类继承。这意味着我需要将这些类中的每一个拆分为两个具有相应重复代码的类(因为很多时候生成调用翻译)

有什么建议(如果我能够很好地解释自己的话)?也许我离代码太近了,应该以不同的方式实现它。

【问题讨论】:

  • GeneratorAndTranslator 实际上是工厂方法:为什么要序列化工厂方法?肯定应该根据其他一些序列化信息创建工厂吗?
  • 您可以实现 IXmlSerializable 并自己处理......尽管我怀疑 Marc Gravell 会提供更好的答案。
  • @silky:在英国可能有点早!
  • @Mitch:但对 Jon Skeet 来说永远不会太早。
  • @Mitch,我不确定你的意思。我希望根据序列化信息填充 GeneratorAndTranslator 属性。如果你能告诉我如何使用工厂模式来做到这一点,我可能会理解你的意思。

标签: .net inheritance serialization interface


【解决方案1】:

由于这是一个自动属性,也许您可​​以使用[field: NonSerialized] 来指示支持字段未序列化?

【讨论】:

【解决方案2】:

我猜这是作弊,因为我有内幕消息,但我为自己做了一些专门的修复。

我意识到实现 IGen 的所有东西也都实现了 ITrans。而且我意识到在实现这两个接口 Generate 的每个类中总是调用 Translate。

所以我创建了一个基础抽象类 GenerateAndTranslate,它有一个名为 Translator 的属性和一个名为 Generator 的属性。它们都是一种称为 TranslatorBase 的新类型,之前实现 ITrans 的所有内容都继承自该类型。

此修复仅适用于我的情况,所以我仍然有兴趣听取其他人的想法。

【讨论】:

  • 如果 Generate always 调用 translate,你为什么需要它?
【解决方案3】:

我本来打算回答你的问题,但意识到在这个问题上确实没有足够的信息/背景来提出一个可靠的建议。

但总体思路是:存储数据,而不是方法。

例如,如果您有 Tiger 类和 Wolf 类,您应该将它们称为 Animal 而不是 IWalk;另一方面,如果您有 Tiger 类和 Robot 类,您可能不得不将它们称为对象,即使它们共享 IWalk 接口。

当您不关心数据而关心方法时,您应该只将对象称为接口。

另外,在 C# 世界中,似乎倾向于对所有内容进行强类型化(这是可以理解的,因为它提供了类型安全和编译时错误检查),但总有机会使用泛型类型和让它们飞起来。

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 1970-01-01
    • 2020-12-27
    • 2022-01-10
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    相关资源
    最近更新 更多