抽象类和接口的概念、区别及示例

  抽象类:它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。

  接口:它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。

  (1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。

  (2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。

  (3)抽象类中可以有构造方法,但是接口没有构造方法。

  (4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。

  (5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。

  (6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码。

<?php
// PHP抽象类示例
abstract class AbstractClass
{
    // 强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . PHP_EOL;
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('DYP_') . PHP_EOL;

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('DYP_') . PHP_EOL;

// 执行结果
/*
ConcreteClass1
DYP_ConcreteClass1
ConcreteClass2
DYP_ConcreteClass2
*/
<?php
// 接口示例
// 小灵通接口
interface Xlt
{
    public function tel();
}
// mp3接口
interface Mp3
{
    public function music();
}
// mp4接口
interface Mp4 extends Mp3
{
    public function video();
}

// 手机类(包含所有功能)
class Mobile implements Xlt,Mp4
{
    public function tel(){ // 重写打电话
        echo '正在打电话....'.PHP_EOL;
    }
    public function music(){ // 重写听歌
        echo '我在听歌...'.PHP_EOL;
    }
    public function video(){ // 重写视频
        echo '播放视频中....'.PHP_EOL;
    }
}
$obj = new Mobile();
$obj->tel();
$obj->music();
$obj->video();

// 执行结果
/*
正在打电话....
我在听歌...
播放视频中....
*/
<?php
// 抽象类示例2
abstract class Stu { // 定义抽象类
    const TITLE = '代元培';
    abstract public function name($age, $sex); // 定义抽象方法
}
class Sure extends Stu { // 继承抽象类
    public function name($age, $sex){
        $str = self::TITLE;
        $str .= '年龄是'.$age.',性别是'.$sex.PHP_EOL;
        return $str;
    }
}
// 抽象类不能被实例化,不能 new Stu,不然报错。
// 抽象方法必须继承,不然报错。
$obj = new Sure();
echo $obj->name(28,'男');

// 执行结果
// 代元培年龄是28,性别是男

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值