public abstract class Animal{}
public class Dog:Animal{
public int Legs{ get; set;}
}
public class An<T>where T:Animal{
public List<T> l = new List<T>();//给v中保存Dog类型数据
public void Print(){
foreach (var v in l)
Console.WriteLine(l.Legs);//怎么访问v中的Legs?
}
}
14 回答
明月笑刀无情
TA贡献1828条经验 获得超4个赞
你的是T是Animal,animal没有Leg,Leg是Dog的;因此需要判断 v is Dog 然后 (v as Dog).Leg;
除非你t直接是Dog你上面就可以直接通过了。
慕少森
TA贡献2019条经验 获得超9个赞
不太好办,你T类型限制在animal上了,变通点的做法是把dog.legs通过委托带进去(带狗腿!?)
void Print(Func<T,object> printQuery)
{
...
Console.WriteLine(printQuery(v));
}
阿波罗的战车
TA贡献1862条经验 获得超6个赞
@风人: 泛型限制的有点好处就是编译安全性,如果一强转那么就失去了这个保证,而且同时增加了对实现的耦合度。
这里正确姿势是提个接口,接口方法的用途就是返回狗腿鸡毛啥的玩意(看你需求),Print方法继续加泛型限制Print<V>() where V:T,ICountable (ICountable返回狗腿数量)
这样就能在保证安全性的同时保证灵活性。
九州编程
TA贡献1785条经验 获得超4个赞
这个确实是,就是现在学到这,觉得这样定义一个容器类挺好的:
用一个泛型数组来保存Animal类各种子类的数据,就是可以定义一个An<Dog>对象来保存n个Dog类对象,也可以定义一个An<Pig>来保存n个Pig对象(Pig也是Animal的子类),因为Dog和Pig都是Animal子类,所以用泛型约束成Animal基类约束。并且在这个泛型容器类里对这个数组进行操作。
- 14 回答
- 0 关注
- 869 浏览
添加回答
举报
0/150
提交
取消