博客列表 >1129_抽象类和接口 第25课

1129_抽象类和接口 第25课

叮叮当当
叮叮当当原创
2019年12月03日 17:09:30689浏览

1. 抽象类

  1. # 一个类一旦被设置为抽象类,就具备了二个特点:
  2. # 不能实例化
  3. # 子类必须实现父类的抽象方法
  4. # 注意:
  5. # 属性设置为抽象无意义, 抽象仅针对方法,类
  6. # 子类的成员可见性必须等于或高于所继承的抽象类成员可见性
  7. # 子类重写的抽象方法可见性,用protected还是pulic, 若该子类最终被客户端访问,就public,否则protected
  8. abstract class Person{
  9. protected $name;
  10. protected function __construct( $name='五竹' ){
  11. $this->name = $name;
  12. }
  13. # 需通过子类对象访问,应设为public
  14. public function getName(){
  15. return $this->name;
  16. }
  17. # 修改属性方法,设为抽象方法,交给子类实现
  18. abstract protected function setName($value);
  19. }
  20. # 当子类继承 抽象父类,普通方法,可直接使用,抽象方法,须重新实现。
  21. class Stu extends Person{
  22. # 注意: 构造方法不会自动继承, 须手动重写
  23. public function __construct( $name='五竹' ){
  24. parent::__construct($name);
  25. }
  26. # 类实例化后,调用此方法,就直接调用,跟抽象方法没关系。
  27. public function setName($value){
  28. $this->name = $value;
  29. }
  30. }
  31. $stu0 = new Stu();
  32. echo '我么的感情,我看不见: ' . $stu0->getName() . '<br>';
  33. $stu = new Stu('闲哥');
  34. echo '才气逼人的小痞哥: ' . $stu->getName() . '<br>';
  35. $stu->setName('滕子京');
  36. # 用setName传值后,值给到父抽象类里的$name,用父抽象类的getName方法可以输出传值
  37. echo '不专业的小杀手: ' . $stu->getName() . '<br>';
  38. echo '<hr>';

2. 接口

  1. # 接口中仅允许出现: 方法与常量
  2. # 接口的方法可见性必须是: public
  3. # 接口中的方法,必须全是抽象方法
  4. # 抽象和接口区别:
  5. # 抽象可以有抽象方法,普通方法,成员变量。
  6. # 接口只有抽象方法,没有普通方法,成员变量。
  7. # 普通类/抽象类 实现接口: implements, 接口继承接口:extends
  8. # 类可 同时 继承 和实现 (先继承,在实现)
  9. # 接口 可同时 继承多个接口,用逗号隔开
  10. interface Ski1{
  11. const COUNTRY = '中国';
  12. # 驱动方式
  13. public function setFuel($fuel);
  14. }
  15. interface Ski2{
  16. # 用途
  17. public function setPurpose($purpose);
  18. }
  19. interface Level extends Ski1, Ski2{
  20. # 等级
  21. public function setLevel( $level );
  22. }
  23. class Story implements Level{
  24. public $fuel;
  25. public $purpose;
  26. public $level;
  27. # 构造方法
  28. public function __construct($fuel='隐身衣', $purpose='风速逃跑', $level='黄金'){
  29. $this->fuel = $fuel;
  30. $this->purpose = $purpose;
  31. $this->level = $level;
  32. }
  33. # 必须实现的接口方法
  34. public function setFuel($fuel){
  35. $this->fuel = $fuel;
  36. }
  37. # 必须实现的接口方法
  38. public function setPurpose($purpose){
  39. $this->purpose = $purpose;
  40. }
  41. # 必须实现的接口方法
  42. public function setLevel($level){
  43. $this->level = $level;
  44. }
  45. # 类中自定义的对象方法
  46. public function getInfo(){
  47. return $this->fuel . $this->purpose . '<br>等级:' .$this->level. '<br>';
  48. }
  49. public function getConst(){
  50. return self::COUNTRY;
  51. }
  52. }
  53. # 客户端代码
  54. $story = new Story();
  55. echo $story->getConst();
  56. echo $story->getInfo();
  57. $story->setFuel('宝塔');
  58. $story->setPurpose('镇河妖');
  59. $story->setLevel('青铜');
  60. echo $story->getInfo();
  61. echo '<hr>';
  1. # 若暂时只实现接口中的部分方法, 可用一个抽象来实现这个接口
  2. # 否则,就必须全部把接口中方法全部实现
  3. interface Skill{
  4. const COUNTRY = '中国';
  5. # 驱动方式
  6. public function setFuel($fuel);
  7. # 用途
  8. public function setPurpose($purpose);
  9. }
  10. abstract class Auto implements Skill{
  11. public $fuel;
  12. # 只实现接口中的setFuel()方法, 另一个方法并未实现
  13. public function setFuel($fuel){
  14. $this->fuel = $fuel;
  15. }
  16. }
  17. # 再创建一个类,来继承扩展这个抽象类 Auto
  18. class Story1 extends Auto{
  19. public $purpose;
  20. # 构造方法
  21. public function __construct($fuel='隐身衣', $purpose='风速逃跑'){
  22. $this->fuel = $fuel;
  23. $this->purpose = $purpose;
  24. }
  25. # 这个方法原来在接口中声明的,在它继承的抽象类中并没有声明
  26. public function setPurpose($purpose){
  27. $this->purpose = $purpose;
  28. }
  29. # 自定义的方法
  30. public function getInfo(){
  31. return $this->fuel . $this->purpose . '<br>';
  32. }
  33. }
  34. $story1 = new Story1();
  35. echo $story1->getInfo();
  36. $story1->setFuel('金箍棒');
  37. $story1->setPurpose('专打白骨精');
  38. echo $story1->getInfo();

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议