C# 关于泛型约束和泛型继承的写法的问题

HIN735 2018-01-11 11:02:49



interface IPerson {
string Sex { get; }
}

interface IDepatment {
string DepInfo { get; }
}


class Student : IPerson ,IDepatment {
public string Sex { get => ""; }
public string DepInfo { get => ""; }
}


class Teacher : IPerson , IDepatment {
public string Sex { get => ""; }
public string DepInfo { get => ""; }
}

class MyObj : List<T>
where T:IPerson,IDepatment{

}
// 希望实现如下功能
// MyObj obj = new MyObj();
// obj.Add(new Teacher());
// obj.Add(new Student());


怎么处理啊。。。
...全文
998 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
最后挑个“名词儿”上的小毛病,因为这个也能直接证明你对接口的理解程度,就是你说“但是在内部里边就拿不到接口的方法了。”,这里 DepInfo 怎么是“方法”呢?这说明你自己都不关注自己的代码类型、接口、方法、属性/字段的分析。
  • 打赏
  • 举报
回复
这个考虑“反射”肯定是错误的设计方法。一个上万行的代码,反射代码也不过1、2处、只有几行而已,真正体现面向对象程序设计原则的地方成百上千,就是考验你是否真懂得接口的基本概念。 你的 MyObj 里边 item 是 IPerson 类型,你写了代码 item.DepInfo,而你又说 IPerson 根本没有 DepInfo这个属性/字段(而是各种子类分别有它们毫无关系的 DepInfo 名字的东西),这就是从业务上都混乱不堪了。 (相对来说)代码不重要,如果连面向自然的领域对象都混乱不堪,那么代码也就是累赘。
  • 打赏
  • 举报
回复
引用 7 楼 HIN735 的回复:
既然你的 MyObj中假设 item 有DepInfo 属性/字段,那么你为什么不在 IPerson 或者 IDepartment 中声明 DepInfo 属性/字段呢? 你这个属于是类型定义不清、搞不明白属性/字段的问题。
threenewbee 2018-01-12
  • 打赏
  • 举报
回复
class MyObj : MyList<只能是一个类型> 或者你需要给IPerson,IDepatment再定义一个基类代替T
  • 打赏
  • 举报
回复
 class MyObj : List<int> 
 class MyObj<T> : List<T>
要么是一个具体的类型,否则必须在前面写T 按你这种,你应该定义一个接口同时继承IPerson,IDepatment
HIN735 2018-01-12
  • 打赏
  • 举报
回复


我想让泛型添加子类,并且能拿到多接口的数据,
只是约束一种子类,对象还是那个对象,
单接口的就可以实现了。
像这种多接口约束子类,想问大家怎么用泛型实现,看来是弄不来了。
上面的只是作为例子,实际上就是想要遍历一个列表,调用接口的方法,如果通过反射也可以实现了。

秋的红果实 2018-01-12
  • 打赏
  • 举报
回复
lz理解错泛型的用途了 在一个地方使用时,T只能是一种类型;在多个不同地方使用时,才可能用不同类型 假如你的系统里,处理教师模块时,T就用Teacher替代;在学生模块就用Student替代,使用在不同地方; 泛型的通用性就像通票一样,去上班,坐1路,回家坐2路,一个时间段你只能在一辆车上,不能既在1路还在2路上 你的问题,可以这样

interface IPerson {
        string Sex { get; }
    }
 
    interface IDepatment {
        string DepInfo { get;  }
    }
 
 
    class Student : IPerson ,IDepatment {
        public string Sex { get => ""; }
        public string DepInfo { get => ""; }
    }
     
 
    class Teacher : IPerson , IDepatment {
        public string Sex { get => ""; }
        public string DepInfo { get => "";  }
    }

List<object> MyObj = new List<object>();
MyObj.Add(new Teacher());
MyObj.Add(new Student());

HIN735 2018-01-11
  • 打赏
  • 举报
回复


这种就不能同时加多个类了。。
HIN735 2018-01-11
  • 打赏
  • 举报
回复

还是不可以啊。。
threenewbee 2018-01-11
  • 打赏
  • 举报
回复
class MyList<T> : List<T> where T:IPerson,IDepatment { } class MyObj : MyList<T>

110,532

社区成员

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

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

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