none
继承一个树类,实际参数列表中使用内部的childList会出现类型转换问题的语法错误,如何避免这个问题? RRS feed

  • 问题

  • 如题,想要实现一个通用树类以及以该类为基础相关的静态工具方法。

    通用树类

    public class BaseTreeEntity :BaseEntity
        {
       
            public long id
            {
                set;get;
            }
            public long pid {
                set;get;
            }
    
            public BaseTreeEntity()
            {
                childNodeList = new ObservableCollection<BaseAdjacencyEntity>();
            }
    
            public BaseTreeEntity pNode { set; get; }
            public ObservableCollection<BaseTreeEntity> childNodeList
            {
                set; get;
            }
            public void add(BaseTreeEntity t)
            {
                childNodeList.Add(t);
                t.pNode = this;
            }
    }

    实现子类

      public class TreeNode: BaseTreeEntity
        {
            public String title { set; get; }
        }
    继承该树类,以便于扩展,但是有2个问题

    问题1,创建子类的泛型集合,调用以BaseTreeEntity为泛型的相关的静态方法,也就是以该子类的父类为泛型,无法通过,提示出现类型转换错误

    public static void IterationTree(Collection<BaseTreeEntity> clist, Action<BaseAdjacencyEntity> run) { foreach (var i in clist) { run(i); if (i.childNodeList.Count != 0) { IterationTree(i.childNodeList, run); } } } //调用 ObservableCollection<TreeNode> clist = new ObservableCollection<TreeNode>(); TreeUtil.IterationTree(clist,((obj)=> { //clist这部分提示类型转换错误 TreeNode i = obj as TreeNode; }) );


    问题2,出于某些需要,需要对继承树类的子类编写一个静态工具方法,含有递归调用,但是却在调用参数那里,出现类型转换错误

    public static long printlTree(Collection<TreeNode> clist, int myl, long count) {
    
                long cs = clist.Count + count;
    
                foreach (var i in clist)
                {
    
                    Console.WriteLine(i.title);
    
    
                    if (i.childNodeList.Count != 0)
                    {
                        int k = myl + 1;
                        cs = printlTree(i.childNodeList, k, cs); // i.childNodeList这段代码显示语法错误,无法从“”转换为“”
                    }
                 
                }
                return cs;
            }


    如何解决上述问题,允许以父类的集合泛型为参数的静态方法能使用继承的子类的集合泛型?





    2019年6月22日 4:42

答案

  • 泛型類別不支援泛型參數的協變與逆變,如果方法內對於該集合只用到 foreach ,請用 IEnumerbale<BaseTreeEntity> 取代 Collection<BaseTreeEntity>  宣告參數

    參考 : 泛型中的协变和逆变


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年6月22日 8:51
  • 另外一種做法就是宣告成 Collection<T> 但使用泛型約束將 T 約束為  BaseTreeEntity

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2019年6月24日 8:02

全部回复

  • 泛型類別不支援泛型參數的協變與逆變,如果方法內對於該集合只用到 foreach ,請用 IEnumerbale<BaseTreeEntity> 取代 Collection<BaseTreeEntity>  宣告參數

    參考 : 泛型中的协变和逆变


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年6月22日 8:51
  • 泛型類別不支援泛型參數的協變與逆變,如果方法內對於該集合只用到 foreach ,請用 IEnumerbale<BaseTreeEntity> 取代 Collection<BaseTreeEntity>  宣告參數

    參考 : 泛型中的协变和逆变


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    IEnumerbale没有add和remove方法
    2019年6月24日 7:24
  • 另外一種做法就是宣告成 Collection<T> 但使用泛型約束將 T 約束為  BaseTreeEntity

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2019年6月24日 8:02