如果要简要的描述多态的话,我个人是这样理解的:通过继承,父类定义方法,具休的实现由子类进行。
//父类 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方法,方法的具体实现由子类进行。
即 如果子类的 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. 前面的 virtual(虚方) 实现多态已经完成了,其实 抽象(abstract)实现多态也是大同小异
2. abstract 和virtual的区别在于abstract 没有方法体,方法都可以被重写。
实现:把上面完整的代码 的父类改成 下面就完成了,功能一样。
//父类 abstract class Person { public abstract void skill();//方法没有方法体 }
1.这里就不是继承了,是实现接口的方法。
2.接口的方法和抽象一样没有方法体。
实现:把上面完整的代码的父类改成接口
//接口 interface Person { void skill(); }
然后把原来子类的 override 去掉 ,因为接口(interface)是不能被重写(override)的。虚方法(virtual),抽象(abstract)才能被重写
OK,接口实现多态也是完成了。
新闻热点
疑难解答