• 接口和抽象类的区别


    1. 接口没有构造函数,接口也可以有构造函数,抽象类可以有构造函数;
    2. 一个类可以同时实现多个接口,但一个类只能继承一个抽象类
    3. 接口中声明的方法只能是public的,默认也是public权限;抽象类可以是public、protected、private(只能非抽象方法可以是private)
    4. 抽象类使用extends继承抽象类(不可以使用extends继承接口!!),  接口可以使用implements 也可以使用extends继承一个或多个接口(implements是实现接口关键字)
    5. 接口中只能放抽象方法(没有abstract关键字修饰的)和const常量,抽象类中可以有成员属性变量、常量,已经实现的方法(非抽象方法)、抽象方法;(抽象方法没有方法体)

    补充:有抽象方法的类一定是抽象类,但是抽象类不一定有抽象方法;可以同时继承抽象类和实现接口,extends要写在前面;接口也可以继承,通过使用 extends 操作符

    接口解决了类不能多继承问题,接口适用于不同系列的类具有相同的动作,不是相同的系列,但具有相同的行为,这个就考虑使用接口,抽象类适用于同一系列,并且有需要继承的成员。

    当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。

    比如人和其他动物都会吃。把吃写成一个接口。因为一个类可以实现多个接口,所以还可以写喝接口等等。

    人和学生,,学生具备人的特征和行为,把人写成抽象类,学生继承这个抽象类。(个人的理解

     下面的程序只是对上面的几点进行验证。划线部分是错的。

     1 interface A
     2 {
     3     // public $a; //报错,不能有变量
     4     const B = '2';
     5     public function __construct(); //可以有构造函数
     6     public function foo();
     7 
     8     public function who();
     9 }
    10 
    11 interface D
    12 {
    13     public function walk();
    14 }
    15 
    16 interface E extends D,A       //继承多个接口没报错
    17 {
    18     public function sing();
    19 }
    20 
    21 // class F implements E 
    22 // {
    23 //     public function sing() {
    24 //         echo 'F implements E ';  //报错,因为E继承多个接口,有5个抽象方法在这个例子中。需要全部实现。说明接口可以继承多个接口
    25 //     }
    26 // }
    27 
    28 // interface G implements A {}    //报错,不能使用implements,implements是实现接口关键字
    29 
    30 
    31 abstract class B implements A    //不能用extends继承接口
    32 {
    33     public function foo() {
    34         echo 222;
    35         echo get_called_class();
    36     }
    37 
    38     public function who() {
    39         echo 333;
    40     }
    41 
    42     private function ime() {
    43         echo '我自己的方法';      //非抽象方法可以设置为private
    44     }
    45 
    46     abstract protected function say(); //抽象方法不可以设置private
    47 }
    48 
    49 class C extends B implements A,D,E
    50 {
    51     public function __construct() {
    52         echo 'this is construct';
    53     }
    54 
    55     public function foo() {
    56         echo 444;
    57         // echo B;
    58         parent::foo();
    59     }
    60 
    61     public function who() {
    62         echo 555;
    63     }
    64 
    65     public function say() {
    66         echo 666;
    67     }
    68 
    69     public function walk() {
    70         echo ' i can walk ---';
    71     }
    72 
    73     public function sing() {
    74         echo 'i can sing';
    75     }
    76 } 
    77 
    78 $b = new C;
    79 $b->foo();
    80 $b->walk();
    81 $b->sing();
    View Code
  • 相关阅读:
    自定义 Laravel 5.7
    1项目环境配置和用户表设计
    Laravel 6.X + Vue.js 2.X + Element UI 开发知乎流程
    component:(resolve) => require
    Vue2.0 render:h => h(App)
    techiediaries Vuejs教程
    techiediaries网站的Laravel 6系列教程
    合并结果插件
    SQLMAP
    CNC MacroProgram
  • 原文地址:https://www.cnblogs.com/bneglect/p/10926871.html
Copyright © 2020-2023  润新知