• 面向对象 OOP中的抽象类,接口以及多态


    [抽象类与抽象方法]
     1、什么是抽象方法?
     没有方法体{}的方法,必须使用abstract关键字修饰,这样的方法,我们称之为抽象方法。
     abstract function say()
     2、什么是抽象类?
     包含抽象方法的类就是抽象类,抽象类必须使用abstract关键字修饰
     abstract class Person{}
     3、抽象类的注意事项
     ①抽象类可以包含非抽象方法
     ②包含抽象方法的类,一定是抽象类
     抽象类 并不一定包含抽象方法
     ③抽象类,不能实例化
     (抽象类中可能包含抽象方法,抽象方法没有方法体,实例化调用没有意义)
     我们使用抽象类的目的就是限制实例化
     4、子类继承抽象类,那么子类必须重写父类的所有抽象方法,除非,子类也是抽象类
     5、使用抽象类的作用?
     ① 限制实例化。(抽象类是一个不完整的类,里面的抽象方法没有方法体,所以不能实例化)
     ② 抽象类为子类的继承提供一种规范,子类继承一个抽象类,则必须包含并且实现抽象类中已定的抽象方法

     abstract class Person{
            abstract function say();
           
               function say1(){}
     
     }
     abstract class Chinese extends Person{
         
     } 

    [接口]
     1、什么是接口?
     接口是一种规范,提供了一组实现接口的类所必须实现的方法组合
     接口的使用interface关键字声明
      interface Inter{}
      2、接口中的所有方法必须都是抽象方法
         接口中的抽象方法不需要也不能使用abstract修饰
      3、接口中不能声明变量,不能有属性,只能使用常量
      4、接口可以继承接口,使用extends关键字
      接口使用extends继承接口,也不能实现多继承
      interface Int1 extends Inter{}
      5、类可以实现接口,使用implements关键字
      类使用implements实现接口,可同时实现多个接口,多个接口用逗号分隔
      abstract class Person implements Inter,Inter2{}
      一个类实现一个或多个接口,那么这个类型必须实现所有接口中的所有抽象方法,除非,这个类是抽象类
      [接口与抽象类的区别]
      1、声明方式上,接口用interface关键字,抽象类使用abstract class
      2、实现继承方式上,一个类使用extends继承抽象类,使用implements实现接口
      3、抽象类只能单继承,接口可以多实现(接口extends接口),多实现(类implements接口)
      4、抽象类中可以有非抽象方法,接口中只能有抽象方法,不能有非抽象方法
      抽象类中的抽象方法必须使用abstract关键字修饰,接口中抽象方法不能带修饰词
      5、抽象类是个类,可以有属性,变量。接口中只能有常量。

    interface  Inter{
        const NUM = 10;
        
         function say();
    }
    
    interface Int1 extends Inter{};
    
     abstract class Person implements Inter{
         
     }

         模拟打印机案例:
            墨盒:彩色、黑白
            纸张类型:A4、B5
            墨盒和纸张都不是打印机厂商提供的
            打印机的打印功能需要使用兼容市场上的墨盒、纸张
            测试 

    interface Mohe{
            function color();
        }
        interface Paper{
            function sizes();
        }
        
        class Printer {
            function prints(Mohe $m,Paper $p){
                echo "即将开始打印...<br>";
                $m->color();
                $p->sizes();
                echo "开始打印...<br>";
                echo "打印完毕!!!<br>";
            }
        }
        
        class black implements Mohe{
            function color(){
                echo "正在装载墨盒...<br>";
                echo "装载黑色墨盒成功...<br>";
            }
        }
        
        class colors implements Mohe{
            function color(){
                echo "正在装载墨盒...<br>";
                echo "装载彩色墨盒成功...<br>";
            }
        }
        
        class A4 implements Paper{
            function sizes(){
                echo "正在加载纸张...<br>";
                echo "加载A4纸张成功...<br>";
            }
        }
        
        class B5 implements Paper{
            function sizes(){
                echo "正在加载纸张...<br>";
                echo "加载B5纸张成功...<br>";
            }
        }
        $parint = new Printer();
        $parint->prints(new colors(), new A4());

    [多态]
    1、一个类被多个子类继承
     如果,这个类的某个方法,再多个子类中,表现出不同的功能,我们称这种行为为多态
     2、实现多态的必要途径
     ①子类继承父类;
     ②子类重写父类方法;
     ③父类引用指向子类对象;

    abstract class Persom{
        abstract function say();
    }
    
    class Chinese extends Persom{
      function say(){
           echo "我是中国人,我说中国话";
      }    
    }
    class English extends Persom{
      function say(){
           echo "I'm an English,I speak English";
      }    
    }
    /*$c = new Chinese();
    $c ->say();
    $e = new  English();
    $e ->say();
    */
    function func(Person $p){
        $p ->say();
    }
    func(new Chinese());
    func(new English());
  • 相关阅读:
    在VMWare虚拟机下的ubuntu中Samba服务的安装
    Shell表达式,如${file##*/}
    如何从官网下载QT
    SATA命令之security
    Clip
    JS判断是否在微信浏览器打开
    微信小程序请求数据报错: 如若已在管理后台更新域名配置,请刷新项目配置后重新编译项目,操作路径:“详情-域名信息”
    typeof()和instanceof的用法区别
    javascrip 对数组的操作方法
    微信小程序 修改数据,并动态渲染页面;修改数组;
  • 原文地址:https://www.cnblogs.com/LJYqq/p/6986223.html
Copyright © 2020-2023  润新知