저는 제 응용 프로그램에서 많은 코드 중복을 제거하고 있습니다. 특히 내 모델을 중심으로. 여러 모델에는 모델 형식의 IEnumerable 인 컬렉션 변형도 있습니다. 이전에 모든 컬렉션 변형은 개별 구현 이었지만 대부분의 코드를 ModelCollection 기본 클래스에 결합 할 수있었습니다.제네릭 컬렉션 객체 위에있는 일반 페이징 객체를 어떻게 설정합니까?
이 컬렉션 모델의 맨 위에는 페이징 값이있는 추가 모델이 있으며, 모두 동일한 속성을 가지고 있으므로 기본 클래스로 축소하려고합니다. .NET에서 다중 상속을 지원하지 않으며 각 ModelCollection 구현을 명시 적으로 구현해야하기 때문에 대부분의 특수 논리가 있으므로 간단한 일반 체인으로도 문제가 해결되지 않습니다.
ModelCollection 기본 클래스 :
public abstract class ModelCollection<TModel> : IEnumerable<T>, IModel where TModel : IPersistableModel
{
protected readonly List<TModel> Models;
protected ModelCollection()
{
Models = new List<TModel>();
}
protected ModelCollection(params TModel[] models)
: this((IEnumerable<TModel>)models)
{
}
protected ModelCollection(IEnumerable<TModel> models)
: this()
{
models.ForEach(Models.Add);
}
public virtual int Count
{
get { return Models.Count; }
}
public virtual IEnumerator<TModel> GetEnumerator()
{
return Models.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public virtual void Add(TModel model)
{
Models.Add(model);
}
public virtual void Accept(Breadcrumb breadcrumb, IModelVisitor visitor)
{
foreach (var model in this)
{
model.Accept(breadcrumb.Attach("Item"), visitor);
}
visitor.Visit(breadcrumb, this);
}
public bool IsSynchronized { get; set; }
}
PagedCollection의 샘플 : 참조
public class PagedNoteCollection : NoteCollection
{
public PagedNoteCollection(params Note[] notes)
: base(notes)
{
}
public int CurrentPage { get; set; }
public int TotalPages { get; set; }
public int TotalNotesCount { get; set; }
}
IModel 해당 인터페이스 :이 문제 성을 이용하여 해결 될 수
public interface IModel
{
void Accept(Breadcrumb breadcrumb, IModelVisitor visitor);
}
당신은의 표현 개선에 대한 권장 사항이있는 경우 질문, 답변 또는 제목은 언제든지 주저하지 말고 설명하거나 수정하십시오. 이것은 모든 것이 확실하고 확실한 복잡한 문제/해결책입니다. – Phaeze