抽象类和接口

在开发的过程中或者在面试的过程中,总是会遇到这个问题,在自己的印象中还是比较模糊的,今天简单的写两条,这个网上也有很多,都大同小异。

抽象类

在声明类时有一个方法时抽象方法,那么这个类就是抽象类,抽象类要使用abstract关键字来修饰。
在抽象类中可以有不是抽象的成员方法和成员属性,但访问权限不能使用private关键字修饰为私有的。

<?php
    abstract class Person{
        protected $name;
        protected $country;
 
        function __construct($name="",$country="china"){
            $this ->name = $name;
            $this ->country = $country;
        }
 
        abstract function say();
        abstract function eat();
 
        function run(){
            echo "使用两条腿走路<br>";
        }
    }
?>

抽象类就像是一个“半成品”的类,在抽象类中有没有被实现的抽象方法,所以抽象类是不能被实例化的,即创建不了对象,也就不能直接使用它。
当子类继承抽象类以后,就必须把抽象类中的抽象方法按照子类自己的需要去实现。子类必须把父类中的抽象方法全部都实现,否则子类中还存在抽象方法,所以还是抽象类,也不能实例化对象。

接口

接口中声明的方法必须都是抽象方法,另外不能再接口中声明变量,只能使用const关键字声明为常量的成员属性,而且接口中所有成员都必须有public的访问权限。

使用extends关键字让一个接口去继承另一个接口,实现接口之间的扩展。

通过类去继承接口时需要使用implements关键字来实现,而并不是使用extends关键字完成。

如果需要使用接口中的成员,则需要通过子类去实现接口中的全部抽象方法,然后创建子类的对象去调用在子类中实现后的方法。

   <?php
      interface 接口名称{ //使用interface关键字声明接口
      常量成员 //接口中的成员属性只能是常量,不能是变量
      抽象方法 //接口中的所有方法必须是抽象方法,不能有非抽象的方法存在
      }
   ?>

<?php
interface one{
const CONSTANT = 'CONSTANT value';
function fun1();
function fun2();
}
 
//声明一个抽象类去实现接口One中的第二个方法
abstract class Three implements One{ //只实现接口中的一个抽象方法
function fun2(){
//具体的实现内容由子类自己决定
}
}
 
//声明一个类实现接口One中的全部抽象方法
class Four implements One{
function fun1(){
//具体的实现内容由子类自己决定
}
 
function fun2(){
//具体的实现内容由子类自己决定
}
}
 
?>

总结

1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。
2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。
3、接口没有构造函数,抽象类可以有构造函数。
4、接口中的方法默认都是public类型的,而抽象类中的方法可以使用protected,public来修饰。
5、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

标签: none

评论已关闭