首页 > 学院 > 开发设计 > 正文

C#基础巩固(1)-多态+简单工厂

2019-11-14 13:54:20
字体:
来源:转载
供稿:网友

多态 

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

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,接口实现多态也是完成了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表