http://blog.csdn.net/kaituozheboke/article/details/52183726

一、抽象类: 无法实例化


类前加 abstract, 此类就成为抽象类,无法实例化.

举例:

春秋战国时期,燕零七 飞行器专家,能工巧匠.他写了一份图纸---【飞行器制造术】

飞行器秘制图谱:

  • 要有一个有力的发动机,喷气式.
  • 要有一个平衡舵,掌握平衡

他的孙子问: 发动机怎么造呢?

燕零七眼望夕阳: 我是造不出来,但我相信后代有人造出来

  1. // 燕零七的构想,当时的科技造不出来,即这个类只能在图纸化,无法实例化.
  2. // 此时这个类没有具体的方法去实现,还太抽象.
  3. // 因此我们把他做成一个抽象类
  4. abstract class FlyIdea {
  5. // 大力引擎,当时也没法做,这个方法也实现不了
  6. // 因此方法也是抽象的
  7. public abstract function engine();
  8. // 平衡舵
  9. public abstract function blance();
  10. /*
  11. ----------------------注意:抽象方法 不能有方法体,写到小括号就行了----------------------
  12. 下面这样写是错误的(有方法体)
  13. public abstract function blance() {
  14. }
  15. Fatal error: Abstract function FlyIdea::engine() cannot contain body
  16. */
  17. }
  18. /*
  19. ----------------------抽象类不能 new 来实例化----------------------
  20. 下面这行是错误的
  21. $kongke = new FlyIdea();
  22. Cannot instantiate abstract class FlyIdea
  23. */
  24. // ------------1----------到了明朝,万户用火箭解决了发动机的问题----------------------
  25. abstract class Rocket extends FlyIdea {
  26. // 万户把engine方法,给实现了,不再抽象了
  27. public function engine() {
  28. echo '点燃火药,失去平衡,嘭!<br />';
  29. }
  30. // 继承自父类,但是万户实现不了平衡舵,(还有一个抽象方法)
  31. // 因此平衡舵对于Rocket类来说,
  32. // 还是抽象的,
  33. // 类也是抽象的 因此类加一个abstract
  34. }
  35. /*
  36. ------------1----------到了现代,燕十八亲自制作飞行器----------------------
  37. 这个Fly类中,所以抽象方法,都已经实现了,不再是梦想.
  38. */
  39. class Fly extends Rocket{
  40. public function engine() {
  41. echo '有力一扔<br />';
  42. }
  43. public function blance() {
  44. echo '两个纸翼保持平衡~~~';
  45. }
  46. public function start() {
  47. $this->engine();
  48. for($i=0;$i<10;$i++) {
  49. $this->blance();
  50. echo '平稳飞行<br />';
  51. }
  52. }
  53. }
  54. $apache = new Fly();
  55. $apache->start();
  56. /*有力一扔
  57. 两个纸翼保持平衡~~~平稳飞行
  58. 两个纸翼保持平衡~~~平稳飞行
  59. 两个纸翼保持平衡~~~平稳飞行
  60. 两个纸翼保持平衡~~~平稳飞行
  61. 两个纸翼保持平衡~~~平稳飞行
  62. 两个纸翼保持平衡~~~平稳飞行
  63. 两个纸翼保持平衡~~~平稳飞行
  64. 两个纸翼保持平衡~~~平稳飞行
  65. 两个纸翼保持平衡~~~平稳飞行
  66. 两个纸翼保持平衡~~~平稳飞行*/
  67. //有一个类是抽象的,但是里面的方法不是抽象的,能否new?
  68. /*
  69. 但是 --- 即便全是具体方法,但类是抽象的,
  70. 也不能实例化.*/
  71. abstract class Car {
  72. public function run() {
  73. echo '滴滴';
  74. }
  75. }
  76. //$qq = new qq();   不能实例化
  77. //解决办法》》》继承
  78. class qq extends Car {
  79. }
  80. $qq = new qq();

总结:

  类前加 abstract 是抽象类

方法前加 abstract 是抽象方法

抽象类 不能 实例化

抽象方法 不能有 方法体

有抽象方法,则此类必是 抽象类

抽象类,内未必有抽象方法

但是 --- 即便全是具体方法,但类是抽象的,

也不能实例化.

二、抽象类的意义


请看如下场景:

Facebook 多国语言欢迎页面

user登陆,有一个 c 字段,是其国家

当各国人登陆时,看到各国语言的欢迎界面

我们可以用面向过程的来做

  1. $c = 'english';
  2. if($c == 'china') {
  3. echo '你好,非死不可';
  4. } else if($c =='english') {
  5. echo 'hi,welcome';
  6. } else if($c == 'japan') {
  7. echo '搜达斯内';
  8. }

反思: 当facebook进入泰国市场时,

增加 else if ,扩展性很差

=====用面向对象来做======

让美国小组/中国开发组/斯蜜达开发组 来开发Welcome类

争执不下: echo 到底该中? 日? 韩?

说: 干脆在wel()方法里,判断一下? 没意义啊

    1. abstract class Welcome {
    2. public abstract function wel();
    3. }
    4. // 这是首页的controller开发者
    5. //$wel = new Welcome();
    6. //$wel->wel();
    7. /*
    8. 说:你们别争执了,我只知道,我要调用wel()方法,就是打招呼,
    9. 你们显示什么语言和我无关.
    10. */
    11. /**
    12. 经理说话:
    13. Welcome谁也不许动,各国开发小组开发自己的招呼类
    14. 另:为了首页的controller开发者便于调用,
    15. 统一继承自welcome类
    16. **/
    17. class china extends Welcome {
    18. public function wel() {
    19. echo '你好,非死不可,<br />';
    20. }
    21. }
    22. class english extends Welcome {
    23. public function wel() {
    24. echo 'hi,welcome';
    25. }
    26. }
    27. class japan extends Welcome {
    28. public function wel() {
    29. echo '搜达斯奈';
    30. }
    31. }
    32. // 再看首页开发者
    33. $c = 'english'; // china, japan
    34. $wel = new $c();
    35. $wel->wel();
    36. /*
    37. 以后新增了泰国语,首页的开发者,根本无需改动
    38. 只需要增加一个泰国的welcome类 就可以了.
    39. 所以有一些面向对象的介绍中,说面向对象的一个特点:可插拔特性
    40. */

最新文章

  1. spring的Scheduled(定时任务)和多线程
  2. SQL SERVER 合并重复行,行列转换
  3. Highcharts 在低版本 IE 上使用注意事项及个人总结
  4. springmvc请求参数异常处理
  5. 【OpenStack】OpenStack系列17之OpenStack私有云设计二
  6. Linux下的sort排序命令详解(一)
  7. Follow your heart
  8. Python 第五天
  9. WPF自学入门(九)WPF自定义窗口基类
  10. 深入Node之初识
  11. 火眼发布Windows攻击工具集
  12. SQL IN 操作符
  13. 第三章 jQuery总结 参考文本
  14. 【OpenStack】network相关知识学习
  15. 解决Win8系统修改IP地址后保存不了的方法
  16. js格式化显示文件大小(bytes 转 KB、、、)
  17. LIS|计蒜客2019蓝桥杯省赛 B 组模拟赛(一)
  18. saliency map [转]
  19. Postgresql ERROR: permission denied for relation app_info
  20. 【Java】 大话数据结构(12) 查找算法(3) (平衡二叉树(AVL树))

热门文章

  1. 使用POI操作Excel时new XSSFWorkbook ()报错java.lang.NoSuchMethodError解决方式
  2. Deepin-安装vscode
  3. LoadRunner 中调用c函数生成随机字符串
  4. 答读者问(6):有关IT培训和毕业之前的迷茫等问题
  5. rocketmq消费队列代码
  6. Servlet访问Javabean并传结果给jsp
  7. grep命令最经常使用的功能总结
  8. iOS 浅谈MVC设计模式及Controllers之间的传值方式
  9. IDEA 使用方法快捷键
  10. 较大主干网的ISP通常控制信道利用率不超过50%