我一直在努力從我的應用程序中刪除大量代碼重複,特別是在我的模型周圍。幾個模型也有一個集合變體,它是模型類型的IEnumerable。以前所有的集合變體都是單獨的實現,但我能夠將他們的大部分代碼合併到一個ModelCollection基類中。如何設置一個通用分頁對象,它位於我的通用集合對象之上?
現在,在這些集合模型之上是帶有分頁值的附加模型,它們都具有完全相同的屬性,所以我也想將它們摺疊到一個基類中。我遇到的問題是,.NET不支持多繼承,因爲每個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 2014-12-19 00:31:29