zoukankan      html  css  js  c++  java
  • 多态的实现

      多态的实现有3种方法:   

      1、类的继承(虚方法) ; 2、抽象类;   3、接口   

      1、类的继承

    继承与里氏转换配合使用也可以实现多态的。在这里简单讲一下里氏转换:a.子类的对象可以隐式转换成父类的对象。例:     Student(子类) st=new Student();Person(父类) p=st;  b.把父类的对象强转成子类的对象。例:Student st=(Student)p;   使用通过继承和里氏转换也可以实现一个对象表现出多种状态。         ->虚方法:子类中对某一个方法大部分相同,个别不同,在父类中定义虚方法,一样的用继承的,不一样的重写。   

      ->例子:假设所有的人都会走路,并且大部分人都是用2条腿走,只有个别人比如老人(3条腿)、残疾人,所以走路定义在人类中,正常人类的子类     都用父类的走路方法继承就行了,特殊子类如老人类可以重写走路的方法    

      ->关键字用在哪里?    

      ->new 如果子类继承父类,而方法名又相同,在子类的方法中加new则叫显示隐藏基类方法,没有new则叫隐式隐藏基类方法;如果不看父类,则不知道父类中是否有这个方法,或者子类的方法是否是父类的重写和隐藏父类的方法;所以只要加了new就是父类的隐藏方法。如果父类中没有这个方法而又加了new则会警告,这个方法不会隐藏继承的成员,不需要new关键字。所以在这种情况下new就是一个标记,表示子类是否是隐藏基类方法。    

      ->virtual和override      virtual是为了让子类重写,所以virtual用在父类里;override表示重写父类方法,所以用在子类中。在父类的方法中加virtual表示      这个方法是虚方法,表示:如果在子类中写了一个同样的方法,在使用时就会调用子类中的方法,而不会调用父类中的这个方法,就是说当子类中没有这个方法时,而又要用这个方法,就会从父类中调用。而override写在子类中时就说明在子类中重写了父类的方法;如果父类中没有写virtual子父类中又写override就会发生异常,2个同样的方法就会冲突,子类中的方法就无法重写。如果父类的方法中写了virtual而子类的方法中没有写override,这种情况是可以发生的,子类一样重写的父类的方法。而如果在子类中使用new关键字的话也是能重写父类方法的。    

      ->public 定义这个类到处可以被访问    

      ->internal 本程序集访问  本项目    

      ->private 只能在本类中访问    

      ->protected 只能在本类和子类中访问     

      ->abstract表示抽象 

      2、抽象类:

            他是用于指定蓝图的,是法律的制定者或规划者,是领导,他自己不做,让手下去做,并且手下的能力不同,完成的效果也不同。所以抽象类也可以实现多态。   

      ->抽象方法:指定蓝图用的,用于子类都必须有,但每个子类的方法实现的功能都不同,用这个在父类中限制子类必须有的方法,并且子类实现了自己与本人不同的方法体。             ->例子:所有国家的人都会说话,但每个国家的人说的语言都不一样,所以把说话定义成抽象方法,定义在抽象类人中,在定义每个国家的人类时都必须有说话的方法,并且每个国家都能说自己的语言。   

      3、接口

            个别子类拥有的方法,定义一个功能(接口),谁想拥有这个功能就继承(接口)。   

      ->例子:接口就是一个规范,比如收作业这个功能接口,既不能定义在父类人类中,因为学生要收作业,老师要收作业,但是工程师不需要收作业;而定义在父类中可以用虚方法和抽象方法,子类工程师不需要收作业这个功能,就不能定义在父类中。所以要定义一个接口功能,那么子类谁想用这个接口功能只要继承接口就行了。   

      

    代码演示:

      抽象类

    namespace _03抽象
    {
        class Program
        {
            static void Main(string[] args)
            {            
                while (true)
                {
                    Person p = CreatePerson();
                    p.Say();
                    Console.ReadKey();
                }
            }
    
            static Person CreatePerson()
            {
                //简单工厂模式
                Random r = new Random();
                int i = r.Next(1, 4);
                switch (i)
                {
                    case 1:
                        return new 中国人();
                    case 2:
                        return new 日本人();
                    default:
                        return new 韩国人();
                }
            }
        }
    
       abstract class Person
        {
            string name;
    
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
    
            public abstract void Say();
        }
    
        class 中国人 : Person
        {
            public override void Say()
            {
                Console.WriteLine("中国话");
            }
        }
    
        class 日本人 : Person
        {
            public override void Say()
            {
                Console.WriteLine("日语");
            }
        }
    
        class 韩国人 : Person
        {
            public override void Say()
            {
                Console.WriteLine("韩语");
            }
        }
    }

     

    虚方法

    namespace _04虚方法
    {
        class Program
        {
            static void Main(string[] args)
            {
                Person p;
                p = new 成年人();
                p.Go();
                p = new 老年人();
                p.Go();
    
                p = new 脚残疾的人();
                p.Go();
              
                Console.ReadKey();
            }
        }
    
         class Person
        {
            string name;
    
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
    
            public virtual void Go()
            {
                Console.WriteLine("用脚走路!");
            }       
        } 
    
         class 成年人 : Person
         {
         }
    
         class 老年人 : Person
         {
    
         }
    
         class 脚残疾的人 : Person
         {
              public override  void Go()
             {
                 Console.WriteLine("脚残,用手走~!");
             }
         }
    }


    接口

    namespace _05接口
    {
    
        interface I收作业
        {
            void 都给我交作业();
        }
    
        class Program
        {
            static void Main(string[] args)
            {
            }
        }
    
        class Person
        {
            string name;
    
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
        }
    
        class 老师 : Person,I收作业
        {
    
            public void 都给我交作业()
            {
                Console.WriteLine("都交作业了!");
            }
        }
        class 学生 : Person, I收作业
        {
    
            public void 都给我交作业()
            {
                Console.WriteLine("都交作业了!");
            }
        }
    
        class 工程师 : Person
        {
    
        }
    }



     

  • 相关阅读:
    智慧园区数字孪生平台GIS+三维可视化的研究
    树莓派联通家庭宽带端口映射
    NetCore 5.0 Dokcer中发布报NU3028、NU3037
    django导入导出excel实践
    MySQL JSON类型
    业务、设计模式、算法
    VIM 简单教程
    k8s go-client 使用简介
    如何健壮你的后端服务
    公共dto打包时按条件导出实现feignclient接口的bean,解决feign.Feign$Builder类找不到的问题
  • 原文地址:https://www.cnblogs.com/kingboy2008/p/2857503.html
Copyright © 2011-2022 走看看