2016-11-20 4 views
0

Я хотел бы создать абстрактный класс для иерархических структурированных объектов.общий абстрактный класс для иерархической структуры

Вот что я уже использую, но теперь я хочу, чтобы сделать его родовое

public class EventBase 
{ 

    private EventBase _Parent; 
    virtual public EventBase Parent 
    { 
     get 
     { 
      return _Parent; 
     } 
     set 
     { 
      _Parent = value; 
     } 
    } 

    [ForeignKey("Parent")] 
    private ICustomList<EventBase> _ChildList = new CustomList<EventBase>(); 
    virtual public ICustomList<EventBase> ChildList 
    { 
     get 
     { 
      return _ChildList; 
     } 
     set 
     { 
      _ChildList = value; 
     } 
    } 
} 

что-то вроде этого:

public class EventBaseGeneric 
{ 

    private GenericTypeThatIsSetInTheInheritingClass _Parent; 
    virtual public GenericTypeThatIsSetInTheInheritingClass Parent 
    { 
     get 
     { 
      return _Parent; 
     } 
     set 
     { 
      _Parent = value; 
     } 
    } 

    [ForeignKey("Parent")] 
    private ICustomList<GenericTypeThatIsSetInTheInheritingClass> _ChildList = new CustomList<GenericTypeThatIsSetInTheInheritingClass>(); 
    virtual public ICustomList<GenericTypeThatIsSetInTheInheritingClass> ChildList 
    { 
     get 
     { 
      return _ChildList; 
     } 
     set 
     { 
      _ChildList = value; 
     } 
    } 
} 

Спасибо большое за любую идею о том, как achiv это!

С наилучшими пожеланиями, Фабиан

ответ

0

Это будет выглядеть следующим образом:

// T generic parameter must inherit EventBase<T> 
public class EventBase<T> 
    where T : EventBase<T> 
{ 
    public virtual T Parent { get; set; } 

    [ForeignKey("Parent")] 
    public virtual ICustomList<T> ChildList { get; set; } = new CustomList<T>() 
} 
0

Я нашел ответ:

public abstract class PersistentObjectBaseWithNameHierarchical <T> 
{ 

    private T _Parent; 
    virtual public T Parent 
    { 
     get 
     { 
      return _Parent; 
     } 
     set 
     { 
      _Parent = value; 
      UpdatePropertiesInHierachy(); 
     } 
    } 

    [ForeignKey("Parent")] 
    private ICustomList<T> _ChildList = new CustomList<T>(); 
    virtual public ICustomList<T> ChildList 
    { 
     get 
     { 
      return _ChildList; 
     } 
     set 
     { 
      _ChildList = value; 
      UpdatePropertiesInHierachy(); 
     } 
    } 
+0

Проверьте мой, он использует общие ограничения. –

+0

А также я реорганизовал ваш код, чтобы использовать авто-свойства и инициализаторы свойств. –

+0

Эй, @ MatíasFidemraizer - большое вам спасибо! Это то, что мне нужно. Мой ответ - всего лишь половина пути .... – Fabianus

0

это может быть, что он должен идти, как это?

public abstract class PersistentObjectBaseWithNameHierarchical<T> : PersistentObjectBaseWithName where T : PersistentObjectBaseWithNameHierarchical<T> 
{ 

    private PersistentObjectBaseWithNameHierarchical<T> _Parent; 
    virtual public PersistentObjectBaseWithNameHierarchical<T> Parent 
    { 
     get 
     { 
      return _Parent; 
     } 
     set 
     { 
      _Parent = value; 
      UpdatePropertiesInHierachy(); 
     } 
    } 

    [ForeignKey("Parent")] 
    private ICustomList<PersistentObjectBaseWithNameHierarchical<T>> _ChildList = new CustomList<PersistentObjectBaseWithNameHierarchical<T>>(); 
    virtual public ICustomList<PersistentObjectBaseWithNameHierarchical<T>> ChildList 
    { 
     get 
     { 
      return _ChildList; 
     } 
     set 
     { 
      _ChildList = value; 
      UpdatePropertiesInHierachy(); 
     } 
    } 


    public void AddChild(PersistentObjectBaseWithNameHierarchical<T> child) 
    { 
     if (ChildList.Count() != 0) 
      child.OrderPosition = ChildList.Max(e => e.OrderPosition) + 1; 

     ChildList.Add(child); 
    } 

    public void OrderChildList() 
    { 
     foreach (var e in ChildList) 
     { 
      e.OrderChildList(); 
     } 
     ChildList.Sort((s1, s2) => s1.OrderPosition.CompareTo(s2.OrderPosition)); 
    } 

    public int Level 
    { 
     get 
     { 
      if (Parent != null) 
      { 
       return Parent.Level + 1; 
      } 
      else 
      { 
       return 1; 
      } 
     } 
    } 


    private double _OrderPosition; 
    virtual public double OrderPosition 
    { 
     get 
     { 
      if (_OrderPosition == 0) 
      { 
       // We use the Id as OrderPosition to keep creation order by default 
       _OrderPosition = Id; 
      } 
      return _OrderPosition; 
     } 
     set 
     { 
      _OrderPosition = value; 
      Parent?.ChildList.Sort((s1, s2) => s1.OrderPosition.CompareTo(s2.OrderPosition)); 
      UpdatePropertiesInHierachy(); 
     } 
    } 

    public void UpdatePropertiesInHierachy() 
    { 
     PersistentObjectBaseWithNameHierarchical<T> r = GetRoot(this); 
     DuringUpdatePropertiesInHierachy(); 
    } 

Потому что в противном случае я получаю ошибку здесь:

GetRoot (это)

говоря

Аргумент 1: не удается преобразовать из 'HostSystems.Models.PersistentObjectBaseWithNameHierarchical' на 'T'

Спасибо за дальнейшие советы!

С уважением, Фабиан

Смежные вопросы