zoukankan      html  css  js  c++  java
  • 通过一个程序来理解PHP里面的抽象类【2】

    代码
    1 <?php
    2
    3  header("Content-Type: text/html; charset=utf-8");
    4
    5  $c = new Cat("catName", "blue");
    6
    7  $d = new Dog("dogName", "yellow");
    8
    9  $b = new Bird("birdName", "flying");
    10
    11
    12  $l1 = new Lady("liluo", $c);
    13
    14  $l2 = new Lady("lifeng", $d);
    15
    16  $l3 = new Lady("coco", $b);
    17
    18
    19  $l1->myPetEnjoy();
    20
    21  $l2->myPetEnjoy();
    22
    23  $l3->myPetEnjoy();
    24
    25  //$a = new Animal("mimi"); //Animal是一个抽象的,不能实例化
    26  
    27
    28  abstract class Animal //因为这个类有抽象方法,所以这个类一定要声明为抽象类
    29  
    30 {
    31
    32 private $name;
    33
    34 public function __construct($name)
    35
    36 {
    37
    38 $this->name = $name;
    39
    40 }
    41
    42 public abstract function enjoy(); //把这个方法定义为抽象的,用来被重写的
    43  
    44 }
    45
    46
    47  class Cat extends Animal //类里面的方法不想自己去实现
    48
    49 {
    50
    51 //也可以把Cat定义为abstract 类,把它的方法定义为抽象的
    52
    53 private $eyesColor;//让继承它的类去实现
    54
    55 public function __construct($name, $eyesColor)
    56
    57 {
    58
    59 $this->eyesColor = $eyesColor;
    60
    61 }
    62
    63
    64
    65 public function enjoy()
    66
    67 {
    68
    69 echo("猫的叫声,咪咪...... <br />");
    70
    71 }
    72
    73 }
    74
    75
    76 class Dog extends Animal
    77
    78 {
    79
    80 private $furColor;
    81
    82
    83
    84 public function __construct($name, $furColor)
    85
    86 {
    87
    88 $this->furColor = $furColor;
    89
    90 }
    91
    92
    93
    94 public function enjoy()
    95
    96 {
    97
    98 echo("狗的叫声, 汪汪...... <br />");
    99
    100 }
    101
    102 }
    103
    104
    105 class Bird extends Animal
    106
    107 {
    108
    109 private $fly;
    110
    111 public function __construct($name, $fly)
    112
    113 {
    114
    115 $this->fly = $fly;
    116
    117 }
    118
    119
    120
    121 public function enjoy()
    122
    123 {
    124
    125 echo("鸟飞得高, 唧唧喳喳...... <br />");
    126
    127 }
    128
    129 }
    130
    131
    132 class Lady
    133
    134 {
    135
    136 private $name;
    137
    138 private $Animal, $pet;
    139
    140
    141
    142 public function __construct($name, $pet)
    143
    144 {
    145
    146 $this->name = $name;
    147
    148 $this->pet = $pet;
    149
    150 }
    151
    152
    153
    154 public function myPetEnjoy()
    155
    156 {
    157
    158 $this->pet->enjoy();
    159
    160 }
    161
    162 }
    163
    164
    165 /*
    166
    167 php 类的特性说明
    168
    169
    170 类中的变量须用 $this-> 访问 而变量是静态的则用 self::访问 类中的常量也一样用 self::访问,
    171
    172 或子类中某变量与父类中的变量同名则子类变量over父类变量,访问的是子类变量,或父中的变量是受
    173
    174 保护或静态的又与子类中的变量同名,则不会over而是一新的变量,或要用self::或类名:: 方式访问
    175
    176 变量则需在定义变量前加 static ,
    177
    178
    179 class father
    180
    181 {
    182
    183 private $var1;
    184
    185 protected $var2;
    186
    187 public $var3;
    188
    189
    190 function f1(){echo("kiss<br>");}
    191
    192 static function f2(){echo("woods<br>");}
    193
    194 }
    195
    196
    197 class son extends father
    198
    199 {
    200
    201 private static $var1 = "var1";
    202
    203 protected $var2;
    204
    205 public $var3;
    206
    207 public static $pv = "var1";
    208
    209
    210 function s(){echo("love<br>");}
    211
    212 static function s1(){echo("love<br>");}
    213
    214 }
    215
    216
    217 father::f2();
    218
    219 son::s();
    220
    221 echo(son::$pv);
    222
    223 */
    224
    225 ?>
    226

    抽象作用:

    假设有一个抽象类: <形状>

    并且有三个类继承了<形状>,它们是《三角形》《矩形》《正方形》

    如果开关里有一个抽象方法:

    public void PrintArea() {}; //输出面积

    如果《形状》类是abstract 的,那么《三角形》《矩形》《正方形》

    里面都必须定义各自的计算面积的方法,如果不定义,那么就会出错,因为它们三者计算面积的方法

    是不同的。

    假如《三角形》类没有定义PrintArea() 方法,则程序运行在多态时,调用〈三角形〉的方法时就会

    出错。

    基类PrintArea() 方法的abstract 就限制了《三角形》《矩形》《正方形》必须都有自己的方法 PrintArea() ,这是abstract 规定的。

    抽象作用:

    假设有一个抽象类: <形状>

    并且有三个类继承了<形状>,它们是《三角形》《矩形》《正方形》

    如果开关里有一个抽象方法:

    public void PrintArea() {}; //输出面积

    如果《形状》类是abstract 的,那么《三角形》《矩形》《正方形》

    里面都必须定义各自的计算面积的方法,如果不定义,那么就会出错,因为它们三者计算面积的方法

    是不同的。

    假如《三角形》类没有定义PrintArea() 方法,则程序运行在多态时,调用〈三角形〉的方法时就会

    出错。

    基类PrintArea() 方法的abstract 就限制了《三角形》《矩形》《正方形》必须都有自己的方法 PrintArea() ,这是abstract 规定的。

  • 相关阅读:
    Git
    linux下利用virtualenv搭建虚拟环境
    Session和Cookie
    Redis
    从零开始学Go之基本(二):包、函数声明与格式化输出
    从零开始学Go之HelloWorld
    C++ vector容器使用
    FIRST集和FOLLOW集的计算
    go编译错误:runnerw.exe:CreateProcess failed with error 216:
    Linux下vi编辑器常用命令
  • 原文地址:https://www.cnblogs.com/sunss/p/1836877.html
Copyright © 2011-2022 走看看