Blogger Information
Blog 37
fans 1
comment 0
visits 27050
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
1129_抽象类和接口 第25课
叮叮当当
Original
690 people have browsed it

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();

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:完成的不错呢, 这几天的复习课, 上了吗?
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post