现有两个类,分别为 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 来实现)。还请大侠帮帮忙~~
谢谢大家~~!!
{
}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 来实现)。还请大侠帮帮忙~~
谢谢大家~~!!
解决方案 »
- C# 获取 对应远程IP地址的本地IP
- how to use WinHttp with "async=true"?
- Infragistics netadvanage中ultragrid展示多条数据时,出现多界面
- 反射之后怎么能更新Dll?exe没有退出的情况下.
- 关于buttonBar的停靠问题
- DbCommand.ExecuteReader()内存泄露?
- 如何在VB6.0中调用由C#编写的DLL文件?解决后马上给分!!
- 顶就有分
- 请问两个.net控件
- net remoting 的问题,高分求解,非常急.
- 请教使用easycap USB视频采集卡的问题
- JS里跳转页面中URL地址内参数加密解密问题
我现在能想到的解决思路是:如何在IList<T>中指定泛型的类型为T以及T的子类,
另外如果还有别的什么好方法来解决我现在的问题,谢谢提出来~~!
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();
}
}
还有,你这个设计好像不太好,你能说说你的需求是什么嘛,
实际上,下面还设有Test3等多层抽象。你有什么好的设计么??谢谢指教~~
如果你要用Test2.List返回IList<Student>,应该用new表示这是一个不同的方法:
public new IList<Student> List
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);
} }
}
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;
}
}
}