从泛型类中继承

weikeli19 2016-10-01 04:31:56
我书上划下来的1号2号句子什么意思啊?最好分别能举个简单的例子 谢谢啦!国庆节快乐!!
书上所说的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace delete2
{
public class Farm<T> : IEnumerable<T>
where T : Animal
{
private List<T> animals = new List<T>();
public List<T> Animals
{
get
{
return animals;
}
}

public IEnumerator<T> GetEnumerator()
{
return animals.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return animals.GetEnumerator();
}

public void MakeNoises()
{
foreach (T animal in animals)
{
animal.MakeANoise();
}
}
public void FeedTheAnimals()
{
foreach (T animal in animals)
{
animal.Feed();
}
}

public Farm<Cow> GetCows()
{
Farm<Cow> cowFarm = new Farm<Cow>();
foreach (T animal in animals)
{
if (animal is Cow)
{
cowFarm.Animals.Add(animal as Cow);
}
}
return cowFarm;
}
}

public class SuperCow : Cow
{
public void Fly()
{
Console.WriteLine("{0} is flying!", name);
}
public SuperCow(string newName)
: base(newName)
{ }
public override void MakeANoise()
{
Console.WriteLine("{0} says 'here I come to save the day!'", name);
}
}

public class Cow : Animal
{
public void Milk()
{
Console.WriteLine("{0} has been milked.", name);
}
public Cow(string newName)
: base(newName)
{ }
public override void MakeANoise()
{
Console.WriteLine("{0} says 'moo!'", name);
}
}

public class Chicken : Animal
{
public void LayEgg()
{
Console.WriteLine("{0} has laid an egg.", name);
}
public Chicken(string newName)
: base(newName)
{
}
public override void MakeANoise()
{
Console.WriteLine("{0} says 'cluck!';", name);
}
}

public abstract class Animal
{
protected string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public Animal()
{
name = "The animal with no name";
}
public Animal(string newName)
{
name = newName;
}
public void Feed()
{
Console.WriteLine("{0} has been fed.", name);
}
public abstract void MakeANoise();
}


class Program
{
static void Main(string[] args)
{
Farm<Animal> farm = new Farm<Animal>();
farm.Animals.Add(new Cow("Jack"));
farm.Animals.Add(new Chicken("Vera"));
farm.Animals.Add(new Chicken("Sally"));
farm.Animals.Add(new SuperCow("Kevin"));
farm.MakeNoises();

Farm<Cow> dairyFarm = farm.GetCows();
dairyFarm.FeedTheAnimals();

foreach (Cow cow in dairyFarm)
{
if (cow is SuperCow)
{
(cow as SuperCow).Fly();
}
}
Console.ReadKey();
}
}
}

教材内容如下:
...全文
147 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Poopaye 2016-10-01
  • 打赏
  • 举报
回复
1 如果SuperFarm的T可以约束为struct,那么下面的代码就应该能成立
Farm<int> farm = new SuperFarm<int>();
但是因为Farm的T已经约束为了Animal,所以上面的转换不能成立 出现了矛盾 2 如果SuperFarm的T可以约束为class,那么下面的代码就应该能成立
Farm<AnotherClass> farm = new SuperFarm<AnotherClass>();
但是因为Farm的T已经约束为了Animal,所以上面的转换不能成立 也出现了矛盾 总结来说 子类的约束范围不能超过父类的约束
john_QQ:2335298917 2016-10-01
  • 打赏
  • 举报
回复
其实这两个句子的意思都是说父类的泛型参数约束不能被破坏,不能扩大或者改变为其他的类型。第一种情况就是改变为其他的类型了,第二种情况就是扩大了约束集合,这两种情况都不会被编译,但是缩小范围能够被接受。如将animal缩小为supercow

110,539

社区成员

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

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

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