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; >> } >> }>
>> public BaseTVItemViewModel(Interfaces.IsTreeModel<U> tm)
>> {
>> _treeModel = tm;
> Initialize(tm);
>> }
>
>>> public UIItemTVModel(UIItem u) >> : base(u) >> { >> // not needed Initialize(u); >> } >> >