zoukankan      html  css  js  c++  java
  • PHP面向对象(五)

    一、抽象方法和抽象类
      在OOP语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法做为外部代码访问其的接口。而抽象方法就是为了方便继承而引入的。

      抽象方法:当类中有一个方法,他没有方法体,也就是没有花括号,直接分号结束,象这种方法我们叫抽象方法,必须使用关键字abstract定义
        例如:public abstract function fun();
      抽象类:包含抽象方法的类必须是抽象类也要使用关键字abstract加以声明。(即使用关键字abstract 修饰的类为抽象类
      抽象类的特点:
        不能实例化,也就new成对象
        若想使用抽象类,就必须定义一个类去继承这个抽象类,并定义覆盖父类的抽象方法(实现抽象方法)。

      其实抽象类对于子类(实现类),有一个约束的作用。子类继承一个抽象父类必须实现父类中的所有抽象方法(除非它也是一个抽象类)
        注意:含有抽象方法的类肯定是抽象类,但是不是所有的抽象类都必须包含抽象方法。

     1 <?php
     2     //抽象类父类A
     3     abstract class A
     4     {
     5         public function fun1()        
     6         {
     7             echo "fun1()...<br/>";
     8         }
     9         
    10         public function fun2()        
    11         {
    12             echo "fun2()...<br/>";
    13         }
    14         
    15         public abstract function fun3();    
    16         
    17         /**
    18          *求和方法
    19          * @param int $a 被求和参数1
    20          * @param int $b 被求和参数2
    21          * @return int 返回求和结果
    22          */
    23         public abstract function add($a,$b);    
    24         
    25     }
    26 
    27     class B extends A
    28     {
    29        public function fun3()        
    30         {
    31             echo "fun3()...<br/>";
    32         }
    33 
    34        public function add($x,$y)    //这就是约束:函数名必须是add,参数必须有两个
    35        {
    36            return $x+$y;
    37        }
    38     }
    39 
    40     $b = new B();
    41     $b->fun1();
    42     $b->fun2();
    43     $b->fun3();
    44     echo $b->add(10,20);
    45 ?>

    二、接口
      PHP与大多数面向对象编程语言一样,不支持多重继承,也就是说每个类只能继承一个父类。为了解决这个这个问题,PHP引入了接口,接口的思想是指定了一个实现了该接口的类必须实现的一系列函数。
      接口:如果在一个抽象类中包含的只有抽象方法,可以将其定义为interface(接口),用implements(实现)关键字使用它。
      定义格式
        interface 接口名称
        {
          //常量成员 (使用const关键字定义)
          //抽象方法 (不需要使用abstract关键字)
        }
      使用格式: class 类名 implements 接口名1,接口名2{ ... ... }

      当一个类在实现了一个接口后,它必须实现即覆盖该接口的所有方法才可以实例化使用,否则即为抽象类。

     1 <?php
     2     //接口
     3     interface A
     4     {
     5         public function fun1();
     6         
     7         public function fun2();
     8         
     9         public function fun3();
    10         
    11     }
    12 
    13     //定义了类B实现接口A
    14     abstract class B implements A
    15     {
    16        public function fun1()
    17        {
    18             echo "fun1()...<br/>";
    19        }
    20        public function fun2()
    21        {
    22             echo "fun2()...<br/>";
    23        }
    24        
    25     }
    26     class C extends B
    27     {
    28        public function fun3()
    29        {
    30             echo "fun3()...<br/>";
    31        }
    32     }
    33 
    34     $b = new C();
    35     $b->fun1();
    36     $b->fun2();
    37     $b->fun3();
    38 ?>

    三、抽象类与接口的区别
      定义:
        抽象类表示该类中可能已经有一些方法的具体定义。
        接口就仅仅只能定义各个方法的界面,不能有具体的实现代码在成员方法中。
      用法:
        抽象类是子类用来继承的,当父类已有实际功能的方法时,该方法在子类中可以不必实现。
        实现一个接口,必须实现接口中所有定义的方法,不能遗漏任何一个。
      理解: 接口就像公司老板(每年定下一系列目标,不去做,只提出各种计划)
          抽象类就像公司各层级经理(配合老板定下的计划,实现一部分,分发一部分任务员工)
            最终继承的类就是普通员工(接收经理分发的任务,按照要求,毫不遗漏的完成)
    四、多态
      对象的多态性是指在父类中定义的属性或行为被子类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在父类及其各个子类中具有不同的语义。
      为什么要多态?
        多态可以使程序可扩展性更强,减少代码更改量。
      实现多态的方法:继承(重写)、抽象、接口
      例如:"几何图形"的"绘图"方法,"椭圆"和"多边形"都是"几何图"的子类,其"绘图"方法功能不同。

     1 <?php
     2     //多态
     3     //主板上的PCI插槽接口
     4     abstract class PCI
     5     {
     6         public abstract function start();
     7         public abstract function stop();
     8     }
     9 
    10     //主板类
    11     class MainBoard
    12     {
    13         public function running(PCI $pci)
    14         {
    15             $pci->start();
    16             $pci->stop();
    17         }
    18     }
    19 
    20     //声卡厂家
    21     class SoundCard extends PCI
    22     {
    23         public function start()
    24         {
    25             echo "声卡启动...<br/>";
    26         }
    27         
    28         public function stop()
    29         {
    30             echo "声卡停止...<br/>";
    31         }
    32     }
    33 
    34     //网卡厂家
    35     class NetWorkCard extends PCI
    36     {
    37         public function start()
    38         {
    39             echo "网卡启动...<br/>";
    40         }
    41         
    42         public function stop()
    43         {
    44             echo "网卡停止...<br/>";
    45         }
    46     }
    47 
    48 
    49     //使用:主程序
    50     $mb = new MainBoard();
    51     $sc = new SoundCard();
    52     $nc = new NetworkCard();
    53 
    54     $mb->running($sc);
    55     $mb->running($nc);
    56 ?>
  • 相关阅读:
    stm32 oled学习
    PWM输出配置步骤
    IIC通信笔记
    运算放大器原理
    stm32跑马灯实现及蜂鸣器实验
    一个字节多少位
    pyQT编写界面调用摄像头
    PAT Advanced 1151 LCA in a Binary Tree (30) [树的遍历,LCA算法]
    PAT Advanced 1143 Lowest Common Ancestor (30) [二叉查找树 LCA]
    PAT Advanced 1147 Heaps (30) [堆,树的遍历]
  • 原文地址:https://www.cnblogs.com/yexiang520/p/5665246.html
Copyright © 2011-2022 走看看