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);
> }
Then the constructor of the derived class would become> public UIItemTVModel(UIItem u) > : base(u) > { > // not needed Initialize(u); > } >