使用泛型继承和接口定义类

时间:2012-07-20 06:57:33

标签: c# generics

我正在尝试创建一个派生自ObservableCollection的类,并将其自身限制为仅与特定基类(BaseMetadata)一起使用。它还需要实现IXmlSerializable接口,因为我正在为集合添加持久性功能。

这是集合的类定义......

public class CollectionMetadata<T> : ObservableCollection<T> where T : BaseMetadata,
                                     IXmlSerializable
{
    XmlSchema IXmlSerializable.GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
    }

    public void WriteXml(XmlWriter writer)
    {
    }
}

... BaseMetadata可以简化为空类,但仍会产生错误......

public class BaseMetadata
{
}

...我收到以下错误....

CollectionMetadata<T>.IXmlSerializable.GetSchema()': 
    containing type does not implementinterface 
    'System.Xml.Serialization.IXmlSerializable'

...来自上面代码的以下一行......

XmlSchema IXmlSerializable.GetSchema()

我一定错过了一些非常明显的东西?

2 个答案:

答案 0 :(得分:2)

在目前的形式中,您将IXmlSerializable作为约束应用于T;不要将其声明为CollectionMetadata<T>的界面。所以你的显式接口实现是呻吟,因为它找不到接口。

您只需要在约束之前将IXmlSerializable界面移动到

public class CollectionMetadata<T> : ObservableCollection<T>, IXmlSerializable
                                     where T : BaseMetadata

作为旁注 - 你为此使用了一个明确的接口实现可能是一件非常好的事情,否则这可能是一个真正令人头疼的问题。因为作为公共方法,编译器此时不会呻吟,但如果您尝试将集合作为IXmlSerializable传递,则会抱怨。

答案 1 :(得分:1)

您说T实现了IXmlSerializable接口。据推测,你实际上意味着说ColelctionMetadata<T>实现它:

public class CollectionMetadata<T> : ObservableCollection<T>, IXmlSerializable
      where T : BaseMetadata

对于ReadXmlWriteXml,它不会出现问题,因为即使没有界面,它们也只是常规方法。但是,除非您确实实现了这些方法,否则编译器不会允许您使用“显式接口实现”,XmlSchema IXmlSerializable.GetSchema()是一个显式接口实现。