不使用接口的多接口继承

时间:2009-09-22 03:18:11

标签: .net inheritance serialization interface

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

我有两个接口,比如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,所以它们不能简单地从抽象基类继承。这意味着我需要将每个类拆分成两个类,并使用相应的代码重复(因为Generate调用很多时候都会调用)

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

3 个答案:

答案 0 :(得分:0)

因为这是一个autoproperty,也许您可​​以使用[field: NonSerialized]来表示支持字段没有被序列化?

答案 1 :(得分:0)

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

我意识到实现IGen的一切也实现了ITrans。我意识到在每个类中实现了两个接口Generate总是称为Translate。

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

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

答案 2 :(得分:0)

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

但一般的想法是:存储数据,而不是方法。

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

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

在一个不相关的说明中,在C#世界中,似乎倾向于强类型的所有东西(这是可以理解的,因为它提供了类型安全和编译时错误检查),但始终有机会使用泛型类型和把它们放在飞行中。