두 개 이상의 하위 클래스에 대해 generic 형식을 "전파"하려고 할 때 몇 가지 문제가 있습니다. 클래스의 세 가지 레이어가 있습니다. GenericResponseDtoMapper<T>
은 추상 클래스이고 T
은 GenericSearchResponseDto
입니다.generics의 계층 적 사용
GenericResponseDtoMapper
: SimpleResponseDtoMapper
및 GroupedResponseDtoMapper
까지 확장되는 두 개의 하위 클래스가 있습니다. 두 가지 하위 클래스에서 나는 제네릭 타입을 지정해야합니다. 나는 반드시 써야한다 :
SimpleResponseDtoMapper : GenericResponseDtoMapper<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);
}
더 클래스 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);
}
그리고 마지막으로 특정 구현 :
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;
}
이 문제는 형식 시스템에서 너무 많은 비즈니스 문제를 해결하려고 할 때 매우 문제가됩니다. 비록 그것이 작동하도록 만들 수 있다고하더라도, 아무도 타입 간의 관계를 이해하지 못할 것입니다. "사과 바구니 한 바구니"보다 더 복잡하다면, 미래의 프로그래머들은 쉽게 이해할 수 없을 것입니다. "제네릭이 없다면이 문제를 해결하기 위해 어떤 인터페이스를 사용할 것인가?" 그 가이드가 당신의 디자인을하도록하십시오. –