泛型,多态与遗传

时间:2014-04-17 09:04:46

标签: c# xml generics inheritance polymorphism

我目前正在尝试实现一个抽象算法

后者通过开发人员提供的解析器将Data转换为Xml 进入预期的指定类型

这种转换器的接口:

public interface IParser<TExcpected, TSource> where TExcpected : class where TSource : class
{
    TExcpected Parse(TSource source);
}

这一切都适用于许多不同类型,直到需要专门化它 并通过指定的算法将键值对转换为元数据 原型:

public abstract class KeyValuePairParserBase<TKey, TValue, TMetadata> 
    : IParser<TMetadata, IEnumerable<KeyValuePair<TKey, TValue>>> where TMetadata : class
{
    public abstract TMetadata Parse(IEnumerable<KeyValuePair<TKey, TValue>> source);
}

然后我实现了一个默认类,作为开发人员类的代表

 class KeyValuePairParser<TKey,TValue>
    : KeyValuePairParserBase<TKey, TValue,KeyValuePairList<TKey,TValue>>
{
   public override KeyValuePairList<TKey,TValue> Parse(IEnumerable<KeyValuePair<TKey, TValue>> source)
    {.....}
}

其中KeyValuePairList是一个通用的Xml Serializable类,包含一些默认格式的元数据列表。

在算法类中,它也有这三个通用类型参数, 我有一个基本类型的属性

   public KeyValuePairParserBase<TKey,TValue,TSerialized> Parser {get;set;}

并且在尝试这样做时

 Parser = new KeyValuePairParser<TKey,TValue>();

编译器声称类型不匹配

我错过了什么?

帮助将不胜感激!

环境:Windows 8.1 .NET 4.5.1,C#,VS 2013

2 个答案:

答案 0 :(得分:1)

如果你看一下实例类的定义:

 class KeyValuePairParser<TKey,TValue>
    : KeyValuePairParserBase<TKey, TValue,KeyValuePairList<TKey,TValue>>

您将看到只有2个类型参数:TKey和TValue

但是字段

private KeyValuePairParserBase<TKey,TValue,TSerialized> Parser {get;set;}

定义了三个类型参数:TKey,TValue和TSerialized。

您必须将此字段定义为:

private KeyValuePairParserBase<TKey,TValue, KeyValuePairList<TKey,TValue>> Parser {get;set;}

一切都会正确。

答案 1 :(得分:0)

我最终将KeyValuPairList和KeyValuePairParser的使用推迟到继承类,这解决了这个问题。