C# 泛型的分层使用
我在尝试将泛型类型“传播”到多个子类层时遇到了一些问题。 我有三层课程:C# 泛型的分层使用,c#,generics,hierarchical,C#,Generics,Hierarchical,我在尝试将泛型类型“传播”到多个子类层时遇到了一些问题。 我有三层课程: genericsresponsedtomapper是一个抽象类,T是一个genericsearchrresponsedto 我有两个子类扩展了GenericResponseDtoMapper:SimpleResponseDtoMapper和GroupedResponseDtoMapper。 在这两个子类中,我被迫指定泛型类型;为了保持距离,我必须写: SimpleResponseDtoMapper:GenericRespo
genericsresponsedtomapper
是一个抽象类,T
是一个genericsearchrresponsedto
我有两个子类扩展了GenericResponseDtoMapper
:SimpleResponseDtoMapper
和GroupedResponseDtoMapper
。
在这两个子类中,我被迫指定泛型类型;为了保持距离,我必须写:
SimpleResponseDtoMapper:GenericResponseDtoMapper
最后,我有一些类扩展了SimpleResponseDtoMapper
,还有一些类扩展了GroupedResponseDtoMapper
。
我的问题是无法在此级别指定GenericSearchResponseDto
的子类型
那么,我如何管理泛型类型,以便将泛型类型留给第一层和第二层类,让较低级别的类使用泛型类型的指定类型呢
代码如下:
public abstract class GenericResponseDtoMapper<T> : IResponseDtoMapperDecorator where T : GenericSearchResponseDto
{
protected List<T> items;
public GenericResponseDtoMapper()
{
items = new List<T>();
}
public abstract IList<T> GetItems(IList<Entity.FullText_xml.DreDoc> documents);
}
公共抽象类GenericResponseDtoMapper:IResponseDtoMapperDecorator,其中T:GenericSearchResponseDto
{
受保护的清单项目;
公共GenericResponseDtoMapper()
{
项目=新列表();
}
公共摘要IList GetItems(IList文档);
}
类SimpleResponseDtoBuilder:
public abstract class SimpleResponseDtoBuilder : GenericResponseDtoMapper<GenericSearchResponseDto>
{
public SimpleResponseDtoBuilder() : base() { }
public override IList<GenericSearchResponseDto> GetItems(IList<DreDoc> documents)
{
foreach (var doc in documents)
{
var item = new GenericSearchResponseDto();
item.IdDatabank = doc.Field.IdDatabank;
item.IdDocMaster = doc.Field.IdDocMaster;
item.DescDatabank = doc.Field.DescDatabank;
item.Materie = doc.Field.MateriaAll.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
item = setResponseParams(item, doc);
items.Add(item);
}
return items;
}
public abstract GenericSearchResponseDto setResponseParams(GenericSearchResponseDto item, DreDoc doc);
}
公共抽象类SimpleResponseDtoBuilder:GenericResponseDtoMapper
{
公共SimpleResponseDtoBuilder():base(){}
公共覆盖IList GetItems(IList文档)
{
foreach(文档中的var文档)
{
var item=new GenericSearchResponseDto();
item.IdDatabank=doc.Field.IdDatabank;
item.IdDocMaster=doc.Field.IdDocMaster;
item.DescDatabank=doc.Field.DescDatabank;
item.matrie=doc.Field.materialAll.Split(新字符串[]{“|”},StringSplitOptions.RemoveEmptyEntries);
item=设置响应图(item,doc);
项目。添加(项目);
}
退货项目;
}
公共摘要GenericSearchResponseDto setResponseParams(GenericSearchResponseDto item,DreDoc文档);
}
最后是具体实施:
public class GiurisprudenzaResponseDtoBuilder : SimpleResponseDtoBuilder
{
private HighlightHelper _highLightHelper;
private const string _BR = @"<br/>";
public GiurisprudenzaResponseDtoBuilder() : base()
{
_highLightHelper = new HighlightHelper();
}
public override IList<GiurisprudenzaSearchResponseDto> GetItems(IList<DreDoc> documents)
{
return base.GetItems(documents);
}
public override GiurisprudenzaSearchResponseDto setResponseParams(GiurisprudenzaSearchResponseDto item, DreDoc doc)
{
item.IdUnitaDoc = doc.Field.IdUnitaDoc;
... some item.Something = doc.Something...
return item;
}
公共类GiurisprudenzaResponseDtoBuilder:SimpleResponseDtoBuilder
{
私人HighlightHelper\u HighlightHelper;
私有常量字符串\u BR=@“
”;
public GiurisprudenzaResponseDtoBuilder():base()
{
_highLightHelper=新的highLightHelper();
}
公共覆盖IList GetItems(IList文档)
{
返回基地。获取项目(文档);
}
公共覆盖GiurisprudenzaSearchResponseDto setResponseParams(GiurisprudenzaSearchResponseDto项目,DreDoc文档)
{
item.IdUnitaDoc=doc.Field.IdUnitaDoc;
…某个项目.Something=doc.Something。。。
退货项目;
}
在C#中,将泛型类型传播到多个子类层的方法如下:
public TopClass<T> where T : GenericType{
}
public MiddleClass<T> : TopClass<T> where T : GenericType{
}
public BottomClass : MiddleClass<SpecificType>{
}
公共TopClass,其中T:GenericType{
}
公共中间类:顶级,其中T:GenericType{
}
公共底层阶级:中产阶级{
}
这个问题是试图在类型系统中解决太多业务问题的严重症状。即使你能让它工作,也没有人会理解类型之间的关系;如果它比“一篮子桔子,一篮子苹果”更复杂,那么未来的程序员将不容易理解。问问你自己“如果我没有泛型,我会用什么接口来解决这个问题?”让它来指导你的设计。