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

多态 

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

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

posted on 2015-10-15 16:10  包子wxl  阅读(675)  评论(0编辑  收藏  举报