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 ?>
  • 相关阅读:
    [ERR] Node 10.211.55.8:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    PAT A1137 Final Grading (25 分)——排序
    PAT A1136 A Delayed Palindrome (20 分)——回文,大整数
    PAT A1134 Vertex Cover (25 分)——图遍历
    PAT A1133 Splitting A Linked List (25 分)——链表
    PAT A1132 Cut Integer (20 分)——数学题
    PAT A1130 Infix Expression (25 分)——中序遍历
    PAT A1142 Maximal Clique (25 分)——图
    PAT A1141 PAT Ranking of Institutions (25 分)——排序,结构体初始化
    PAT A1140 Look-and-say Sequence (20 分)——数学题
  • 原文地址:https://www.cnblogs.com/yexiang520/p/5665246.html
Copyright © 2011-2022 走看看