zoukankan      html  css  js  c++  java
  • 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,接口实现多态也是完成了。

  • 相关阅读:
    爬虫大作业
    熟悉常用的HDFS操作
    数据结构化和保存
    爬取全部校园新闻
    爬取校园新闻
    Google布隆过滤器
    谷歌json和对象转换
    postgresql和postgis
    json和实体类互相转换
    Linux安装docker-compose
  • 原文地址:https://www.cnblogs.com/wei325/p/4881872.html
Copyright © 2011-2022 走看看