public class BaseTVItemViewModel<U> : ViewModelBase >> where U : EntityObject >> { >> Interfaces.IsTreeModel<U> _treeModel; >> List<BaseTVItemViewModel<U>> _children; >> BaseTVItemViewModel<U> _parent; >> >> public BaseTVItemViewModel(Interfaces.IsTreeModel<U> tm) >> { >> _treeModel = tm; >> } >> >> public BaseTVItemViewModel<U> Parent >> { >> get >> { >> if (_parent == null) >> { >> _parent = new BaseTVItemViewModel<U>((Interfaces.IsTreeModel<U>)_treeModel); >> } >> return _parent; >> } >> set { _parent = value; } >> } >> >> public List<BaseTVItemViewModel<U>> Children >> { >> get >> { >> if (_children == null) >> { >> _children = new List<BaseTVItemViewModel<U>>(); >> >> foreach (U u in _treeModel.GenericChildren) >> { >> _children.Add(new BaseTVItemViewModel<U>((Interfaces.IsTreeModel<U>)u)); >> } >> } >> return _children; >> } >> >> } >> >> public virtual void LoadItems() >> { >> } >> } >>I wanted to make the LoadItems() method abstract but I can't make the class abstract because constructing a new instance of an abstract class (as in the Children property) isn't allowed :-{
> abstract class AbstractBaseClass > { > protected AbstractBaseClass Child = null; > //______________________________________________________________________ > public abstract AbstractBaseClass Create(); > //______________________________________________________________________ > public abstract void LoadItems(); > //______________________________________________________________________ > public void xx() > { > Child = Create(); > } > //______________________________________________________________________ > > } > > class DerivedClass : AbstractBaseClass > { > //______________________________________________________________________ > public override AbstractBaseClass Create() > { > return new DerivedClass(); // or AbstractBaseClass() > } > //______________________________________________________________________ > public override void LoadItems() > { > Child = Create(); // > } > > } >Hi,
public abstract class BaseTVItemViewModel<U,C> : ViewModelBase where U : EntityObject where C : BaseTVItemViewModel<U,C>, new() { protected Interfaces.IsTreeModel<U> _treeModel; List<C> _children; C _parent; public BaseTVItemViewModel() { } public BaseTVItemViewModel(Interfaces.IsTreeModel<U> tm) { _treeModel = tm; } public C Parent { get { if (_parent == null) { _parent = CreateInstance((IsTreeModel<U>) _treeModel.Parent); } return _parent; } set { _parent = value; } } public List<C> Children { get { if (_children == null) { _children = new List<C>(); foreach (U u in _treeModel.GenericChildren) { _children.Add(CreateInstance((IsTreeModel<U>)u)); } } return _children; } } public C CreateInstance(Interfaces.IsTreeModel<U> u) { C x= new C(); x._treeModel = u; x.Initialize((U) u); return x; } public abstract void Initialize(U u); }Seems to work. This way my sub-classes look like:
public class UIItemTVModel : BaseTVItemViewModel<UIItem,UIItemTVModel> { private string _description; private EntityCollection<UIItemRestrictions> _uir; public UIItemTVModel() { } public UIItemTVModel(UIItem u) : base(u) { Initialize(u); } public override void Initialize(UIItem u) { _description = u.Description; _uir = u.Restrictions; } }