你的位置:首页 > ASP.net教程

[ASP.net教程]C#基础巩固


多态 

如果要简要的描述多态的话,我个人是这样理解的:通过继承,父类定义方法,具休的实现由子类进行。

01代码

 //父类  class Person  {    public virtual void skill() //vitrual -虚方法,方法可被重写    {      Console.WriteLine("人会走路");    }  }  class Xiaoming:Person   {    public override void skill() //重写父类方法    {      Console.WriteLine("小明会唱歌");    }  }  class XiaoHu : Person  {    public override void skill()    {      Console.WriteLine("小虎会游泳");    }  }  class Program  {    static void Main(string[] args)    {      Person p1 = new Xiaoming();//里氏转换原则 可以将子类赋值给父类      Person p2 = new XiaoHu();      p1.skill();      p2.skill();      Console.ReadKey();    }  }

输出:

 通过这个例子 Person 类定义了skill方法,方法的具体实现由子类进行。

 

02如果不重写的话

即 如果子类的 override 改为new  那么父类和子类的方法是独立的,此时执行下面的代码

 //父类  class Person  {    public virtual void skill()    {      Console.WriteLine("人会走路");    }  }  class Xiaoming:Person   {    public new  void skill() //重写父类方法    {      Console.WriteLine("小明会唱歌");    }  }    class Program  {    static void Main(string[] args)    {       Person p1 = new Xiaoming();//里氏转原则      Xiaoming p2 = new Xiaoming();      p1.skill();      p2.skill();      Console.ReadKey();    }  }

输出:

可以看出,p.skill();这里看.前面的对象,是什么类型的,就执行那个类里里面的 skill()方法,这里P1是Person类的,P2是Xiaoming类的。

多态+简单工厂

如果我想通过输入 小明,小虎。 这时候系统自动给显示小明会什么,小虎会什么出来。

那么首先增加一个工厂类

生活中工厂是用来加工的产品的,同样这里也是根据传入的参数,加工后返回对应的结果

全部代码

//父类  class Person  {    public virtual void skill()    {      Console.WriteLine("人会走路");    }  }  class Xiaoming:Person //继承Person  {    public override void skill() //重写父类方法    {      Console.WriteLine("小明会唱歌");    }  }  class XiaoHu : Person  {    public override void skill()    {      Console.WriteLine("小虎会游泳");    }  }  //工厂类 --新增  class Factory  {    public static Person instance(string Name)    {      switch (Name)      {        case "1": return new Xiaoming();        case "2":return new XiaoHu();        default: return null;      }    }  }  class Program  {    static void Main(string[] args)    {      Console.WriteLine("请输入序号查看技能,输入1、2....");      Console.WriteLine("1.小明");      Console.WriteLine("2.小虎");      Console.WriteLine("输入:");      string res = Console.ReadLine();      Console.WriteLine("结果:");      Person p = Factory.instance(res);      if (p != null)      {        p.skill();      }      else      {        Console.WriteLine("没找到这个人");      }      Console.ReadKey();    }  }

 

执行结果:

此时,多态+简单工厂就已经实现了。

拓展1:抽象(abstract)实现多态

   1. 前面的 virtual(虚方) 实现多态已经完成了,其实 抽象(abstract)实现多态也是大同小异

   2. abstract 和virtual的区别在于abstract 没有方法体,方法都可以被重写。

  实现:把上面完整的代码 的父类改成 下面就完成了,功能一样。

 //父类  abstract class Person  {    public abstract void skill();//方法没有方法体      }

拓展2:接口(interface)实现多态

 1.这里就不是继承了,是实现接口的方法。

 2.接口的方法和抽象一样没有方法体。

实现:把上面完整的代码的父类改成接口

 //接口  interface Person  {     void skill();  }

然后把原来子类的 override 去掉 ,因为接口(interface)是不能被重写(override)的。虚方法(virtual),抽象(abstract)才能被重写

OK,接口实现多态也是完成了。