2016-12-23 3 views
0

두 개 이상의 하위 클래스에 대해 generic 형식을 "전파"하려고 할 때 몇 가지 문제가 있습니다. 클래스의 세 가지 레이어가 있습니다. GenericResponseDtoMapper<T>은 추상 클래스이고 TGenericSearchResponseDto입니다.generics의 계층 적 사용

GenericResponseDtoMapper : SimpleResponseDtoMapperGroupedResponseDtoMapper까지 확장되는 두 개의 하위 클래스가 있습니다. 두 가지 하위 클래스에서 나는 제네릭 타입을 지정해야합니다. 나는 반드시 써야한다 :

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; 
    } 

UML Class Diagram

+6

이 문제는 형식 시스템에서 너무 많은 비즈니스 문제를 해결하려고 할 때 매우 문제가됩니다. 비록 그것이 작동하도록 만들 수 있다고하더라도, 아무도 타입 간의 관계를 이해하지 못할 것입니다. "사과 바구니 한 바구니"보다 더 복잡하다면, 미래의 프로그래머들은 쉽게 이해할 수 없을 것입니다. "제네릭이 없다면이 문제를 해결하기 위해 어떤 인터페이스를 사용할 것인가?" 그 가이드가 당신의 디자인을하도록하십시오. –

답변

0

여기

코드입니다 C#에서 두 개 이상의 계층의 하위 클래스에 제네릭 형식을 전파하는 방법은 다음과 같습니다.

public TopClass<T> where T : GenericType{ 
} 

public MiddleClass<T> : TopClass<T> where T : GenericType{ 
} 

public BottomClass : MiddleClass<SpecificType>{ 
}