黑马程序员技术交流社区

标题: 接口可这样理解可以吗?接口就是为了实现多态的,求解? [打印本页]

作者: 庞海瑞    时间: 2013-8-11 20:34
标题: 接口可这样理解可以吗?接口就是为了实现多态的,求解?
接口可这样理解可以吗?接口就是为了实现多态的,求解?

作者: 彭家贰小姐    时间: 2013-8-12 00:53
接口是实现多态的一种
多态:一个父类Animal[动物],派生了Wolf[狼]和Sheep[羊]两个子类,由于每个子类都有其不同的代码实现,所以当用父类来引用这些子类时,同样的操作而可以表现出不同的操作结果,这就是所谓的多态。
  1. class Animal
  2. {
  3. public virtual void Eat()
  4. {
  5. Console.WriteLine("动物都要吃东西");
  6. }
  7. }

  8. class Wolf : Animal
  9. {
  10. public override void Eat()
  11. {
  12. Console.WriteLine("我是狼,我要吃羊!");
  13. }
  14. }

  15. class Sheep : Animal
  16. {
  17. public override void Eat()
  18. {
  19. Console.WriteLine("我是羊,我要吃草!");
  20. }
  21. }
复制代码
然后在Main方法里面去调用它们
  1. class Program
  2. {
  3. private static void Main(string[] args)
  4. {
  5. overrideDemo();
  6. Console.ReadKey();
  7. }

  8. private static void overrideDemo()
  9. {
  10. //创建一个父类的数组
  11. Animal[] animals = new Animal[] { new Wolf(), new Sheep() };
  12. foreach (var item in animals)
  13. {
  14. item.Eat();
  15. }
  16. }
  17. }
复制代码

父类的Eat方法根本就没有运行,也就是数组虽然是Animal类型,但是他们分别是Wolf类和Sheep类的实例,而这两个类对Eat方法进行了override,因而执行的是他们重写的函数,而接口也是类似的,不同的是我们不需要override关键字
  1. public interface IAnimal
  2. {
  3. void Eat();
  4. }

  5. public class Wolf : IAnimal
  6. {
  7. public void Eat()
  8. {
  9. Console.WriteLine("我是狼,我要吃羊!");
  10. }
  11. }

  12. public class Sheep : IAnimal
  13. {
  14. public void Eat()
  15. {
  16. Console.WriteLine("我是羊,我要吃草!");
  17. }
  18. }
复制代码
运行结果和上面的类似,虽然类型相同,但是是谁的实例就调用谁的方法,彼此独立。
所以你也可以理解为接口可以实现多态的。









作者: 于驭龙    时间: 2013-8-12 10:24
接口相当于重写行为也就是方法的父类..跟基类又无关....可以看成自定义方法生成器.. 多个类同一个行为 可以用接口实现重写.
作者: 黑马-吕老师    时间: 2013-8-26 13:25
技术分10分可以在黑马报名系统进行入学资格审核,请尽快写够10篇学习日记到入学测试区发帖,并进行下一环节




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2