2016-11-20 87 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這個任何想法!

最好的問候, Fabianus

回答

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'

感謝您的任何進一步的意見!

問候, Fabianus