C# 泛型使用问题 在线等~!先谢谢了~~!

fpy_061625 2011-10-10 11:44:31
现有两个类,分别为 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 来实现)。还请大侠帮帮忙~~
谢谢大家~~!!

...全文
117 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mikeowenlibo 2011-10-25
  • 打赏
  • 举报
回复
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;
}
}


}
fpy_061625 2011-10-11
  • 打赏
  • 举报
回复
我的需求是:Test1中有抽象的属性列表List<Persion>,Test2也有抽象的属性列表List<Student>,而且 Persion和Student均为抽象 student 继承 Persion。而Test2继承Test1,且Test1和Test2也都是抽象。
实际上,下面还设有Test3等多层抽象。

你有什么好的设计么??谢谢指教~~
风骑士之怒 2011-10-11
  • 打赏
  • 举报
回复

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();
}
}


还有,你这个设计好像不太好,你能说说你的需求是什么嘛,
sycainiao1 2011-10-11
  • 打赏
  • 举报
回复
5楼 貌似可行
风骑士之怒 2011-10-11
  • 打赏
  • 举报
回复

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);
}

}
}
jshi123 2011-10-11
  • 打赏
  • 举报
回复
重写方法必须与基类方法的签名一致。
如果你要用Test2.List返回IList<Student>,应该用new表示这是一个不同的方法:
public new IList<Student> List
fpy_061625 2011-10-10
  • 打赏
  • 举报
回复
说了那么多也不知道自己说清楚了没有,简单点说:
我现在能想到的解决思路是:如何在IList<T>中指定泛型的类型为T以及T的子类,
另外如果还有别的什么好方法来解决我现在的问题,谢谢提出来~~!
网站名称:小龙鳃(XiaoLs)专题新闻网站 开发环境:VS2008 + MsSql2005 .net framework 2.0 C# 后台/Admin/Manager/Login.aspx 数据库目录:/App_Data/XiaoLs.mdf 用户名:admin 密码:admin 一、程序简介   本站是一个简洁实用的动态新闻发布网站,可用于小型专题网站的建设,适合初学者。网站不支持安装在虚拟目录下。 二、功能介绍 1.新闻一级分类 2.新闻添加、修改、删除、显示/隐藏 3.搜索结果高亮显示(按标题、来源或内容搜索) 4.用户留言 5.数据库备份 三、学习要点 1.三层架构 2.数据绑定 3.分页功能 4.站内搜索 5.隔行变色(新闻列表每5行加一条分隔线) 6.使用table布局 7.数据库完整备份 8.FCKeditor的使用 9.Md5加密 10.字符串截取 11.JS:新闻条目全选 12.JS:显示当前日期 13.过滤HTML标签 14.List泛型使用 15.验证码 作者简介: 1.常用账号summer31cn、zlong09,小龙鳃是我的绰号,发布这个程序时第一次使用; 2.Email:summer31cn@gmail.com,summer31cn@163.com 。 3.QQ:147957272 。 说明: 1.我也是一名Asp.Net初学者,感觉到入门是辛苦的,因此,将自己写的专题网站给初学者作为参考,希望大家学习愉快。 2.您可以任意使用这个程序,并麻烦您将修改后的程序也传给我一份,多交流学习,共同提高,谢谢:)。 3.如果您觉得程序里有任何错误、不足之处,敬请告之,非常感谢。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧