现有两个类,分别为 Persion 和 Student(studengt继承Persion),代码如下:public class Persion
    {
        
    }class Student : Persion
    {
    }又又两个测试类,分别为Test1和Test2(其中Test2继承Test1),代码如下:public class Test1
    {
        private IList<Persion> list;        public virtual IList<Persion> List
        {
            get
            { 
                if(this.list == null)
                {
                    this.list = new List<Persion>();
                }                return this.list;
            }            set
            {
                this.list = value;
            }
        }
    }public class Test2 : Test1
    {
        private IList<Student> list;        public override IList<Student> List
        {
            get
            {
                if (this.list == null)
                {
                    this.list = new List<Student>();
                }                return this.list;
            }            set
            {
                this.list = value;
            }
        }
    }
我的问题是:

在Student类中的集合属性IList<Student>想去重写Persion的集合属性IList<Persion>,可是现在这样做编译不通过,报错的意思是:子类属性IList<Student>的访问性比父类属性IList<Persion>小,也就是:Student 是继承与 Persion的,所以需要把子类的属性也改为IList<Persion>,可是这样不符合需求,最后我想通过在父类属性IList<Persion>中指定泛型的类型为:Perion以及Persion的所有子类,但是本人刚接触C#不久,不知道该怎么写出这样的泛型类型(在java中可以使用 ? extends T 来实现)。还请大侠帮帮忙~~
谢谢大家~~!!

解决方案 »

  1.   

    说了那么多也不知道自己说清楚了没有,简单点说:
    我现在能想到的解决思路是:如何在IList<T>中指定泛型的类型为T以及T的子类,
    另外如果还有别的什么好方法来解决我现在的问题,谢谢提出来~~!
      

  2.   


    public class Persion
        {
            public string Name { get; set; }
        }    public class Student : Persion
        {
            
        }
        public class Test1<T>
        {
            private IList<T> list;        public virtual IList<T> List
            {
                get
                {
                    if (this.list == null)
                    {
                        this.list = new List<T>();
                    }
                    return this.list;
                }            set
                {
                    this.list = value;
                }
            }
        }    public class Test2<T> : Test1<T>
        {
            private IList<T> list;        public override IList<T> List
            {
                get
                {
                    if (this.list == null)
                    {
                        this.list = new List<T>();
                    }                return this.list;
                }            set
                {
                    this.list = value;
                }
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                IList<Student> list = new List<Student>();
                list.Add(new Student() { Name = "a" });
                list.Add(new Student() { Name = "b" });
                list.Add(new Student() { Name = "c" });            Test2<Student> a = new Test2<Student>();            a.List = list;            foreach (Persion item in a.List)
                {
                    Console.WriteLine(item.Name);
                }
                Console.ReadLine();
            }
        }
    还有,你这个设计好像不太好,你能说说你的需求是什么嘛,
      

  3.   

    我的需求是:Test1中有抽象的属性列表List<Persion>,Test2也有抽象的属性列表List<Student>,而且 Persion和Student均为抽象 student 继承 Persion。而Test2继承Test1,且Test1和Test2也都是抽象。
    实际上,下面还设有Test3等多层抽象。你有什么好的设计么??谢谢指教~~
      

  4.   

    重写方法必须与基类方法的签名一致。
    如果你要用Test2.List返回IList<Student>,应该用new表示这是一个不同的方法:
    public new IList<Student> List
      

  5.   


    namespace ConsoleApplication1
    {
        public abstract class PersonBase
        {
            /// <summary>
            /// 编号
            /// </summary>
            public int ID { get; set; }        /// <summary>
            /// 姓名
            /// </summary>
            public string Name { get; set; }
        }    public class Teacher : PersonBase
        {
            /// <summary>
            /// 工龄
            /// </summary>
            public int WorkYear { get; set; }
        }    public class Student : PersonBase
        {
            /// <summary>
            /// 年级
            /// </summary>
            public int Grade { get; set; }
        }    public interface IOperate<T>
        {
            T this[int index] { get; set; }
            IList<T> List { get; set; }
            void AcceptNotice(Func<T, string> fun);
        }    public class TeacherOp<T> : IOperate<T>
        {
            private IList<T> list;        public T this[int index]
            {
                get { return list[index]; }
                set { list[index] = value; }
            }        public virtual IList<T> List
            {
                get
                {
                    if (list == null)
                    {
                        list = new List<T>();
                    }
                    return list;
                }
                set
                {
                    list = value;
                }
            }        public void AcceptNotice(Func<T, string> fun)
            {
                foreach (T t in List)
                {
                    Console.WriteLine(fun(t));
                }
            }
        }    class Program
        {
            static void Main(string[] args)
            {
                IList<Teacher> list = new List<Teacher>();
                list.Add(new Teacher() { ID = 1, Name = "李老师", WorkYear = 1 });
                list.Add(new Teacher() { ID = 2, Name = "王老师", WorkYear = 3 });
                list.Add(new Teacher() { ID = 1, Name = "张老师", WorkYear = 5 });            IOperate<Teacher> op = new TeacherOp<Teacher>();
                op.List = list;
                op.AcceptNotice(Notice);            Console.ReadLine();
            }        static string Notice(Teacher teacher)
            {
                return string.Format("{0},放假{1}天", teacher.Name, teacher.WorkYear);
            }    }
    }
      

  6.   

    1、报错的意思是:子类属性IList<Student>的访问性比父类属性IList<Persion>小..
    class Student : Persion
      {
      }
    必须改为public class Student : Persion
      {
      }2、接着Test1,Test2调整为
     public class Test1<T> where T:Persion
        {
            private IList<T> list;        public virtual IList<T> List
            {
                get
                {
                    if (this.list == null)
                    {
                        this.list = new List<T>();
                    }                return this.list;
                }            set
                {
                    this.list = value;
                }
            }
        }    public class Test2<T> : Test1<T> where T:Student
        {        private IList<T> list;        public override IList<T> List
            {
                get
                {
                    if (this.list == null)
                    {
                        this.list = new List<T>();
                    }                return this.list;
                }            set
                {
                    this.list = value;
                }
            }      
        }