PHP:抽象类、抽象方法、接口、接口扩展、多态

抽象类:

#含有抽象方法的类.
abstract class Usb{
abstract public function say();
}


含有抽象方法的类

<?php 
//Usb父类
abstract class Usb{
	public function load(){
		echo "<p>Usb is loading</p>";
	}

	public function start(){
		echo "<p>Usb is starting</p>";
	}

	abstract public function unload();
}

//子类
class Upan extends Usb{
	public function unload(){
		echo "<p>Usb is unloading</p>";
	}

	public function jitui(){
		echo '<p>我喜欢鸡腿</p>';
	}
}


 ?>

**

<?php
include 'Person.class.php';

$obj=new Upan();
$obj->load();
$obj->start();

$obj->unload();
$obj->jitui();




?>

**

Usb is loading

Usb is starting

Usb is unloading

我喜欢鸡腿

抽象方法:

#未被实现的方法.
abstract public function start();


**


**


接口:

#只含有抽象方法的类.
interface Usb{
public function say();
}


**

<?php 
//Usb父类
interface Usb{
	public function load();

	public function start();

	public function unload();
}

//子类
class Upan implements Usb{
	public function load(){
		echo "<p>Usb is loading</p>";
	}

	public function start(){
		echo "<p>Usb is starting</p>";
	}

	public function unload(){
		echo "<p>Usb is unloading</p>";
	}

	public function jitui(){
		echo '<p>我喜欢鸡腿</p>';
	}
}


 ?>

**

<?php
include 'Person.class.php';

$obj=new Upan();
$obj->load();
$obj->start();

$obj->unload();
$obj->jitui();




?>

**

Usb is loading

Usb is starting

Usb is unloading

我喜欢鸡腿

接口扩展:

#子接口继承父接口中的所有抽象方法
interface Usb2 extends Usb1{
public function say2();
}


**

<?php 
//Usb父类
interface Usb{
	public function load();

	public function start();

	public function unload();
}

interface Usb2 extends Usb{
	public function run();
}

//子类
class Upan implements Usb2{
	public function load(){
		echo "<p>Usb is loading</p>";
	}

	public function start(){
		echo "<p>Usb is starting</p>";
	}

	public function unload(){
		echo "<p>Usb is unloading</p>";
	}

	public function run(){
		echo "<p>Usb is runing</p>";
	}

	public function jitui(){
		echo '<p>我喜欢鸡腿</p>';
	}
}


 ?>

**

<?php
include 'Person.class.php';

$obj=new Upan();
$obj->load();
$obj->start();

$obj->unload();
$obj->jitui();
$obj->run();




?>

**

Usb is loading

Usb is starting

Usb is unloading

我喜欢鸡腿

Usb is runing

多态:

#多种形态
#只有实现了Usb类或接口体内的所有抽象方法的类所生产出来的对象才能使用useUsb函数
function useUsb(Usb $o){
$o->load();
$o->start();
$o->unload();
echo ‘


’;
}


**

<?php 
include 'Person.class.php';

$obj=new Upan();
$obj2=new Udisk();
$obj3=new Ucharge();

//t420电脑usb接口只认别符合国际Usb规范的标准设备
function useUsb(Usb $o){
	$o->load();
	$o->start();
	$o->unload();
	echo '<hr>';
}

useUsb($obj);
useUsb($obj2);
useUsb($obj3);

 ?>

多态2

多态2

【示例】例举了通常采用流程控制语句实现不同类的处理。其代码如下所示。

class painter{ //定义油漆工类
public function paintbrush(){ //定义油漆工动作
echo "油漆工正在刷漆!\n";
}
}

class typist{ //定义打字员类
public function typed(){ //定义打字员工作
echo "打字员正在打字!\n";
}
}

function printworking($obj){ //定义处理类
if($obj instanceof painter){ //若对象是油漆工类,则显示油漆工动作
$obj->paintbrush();
}elseif($obj instanceof typist){ //若对象是打字员类,则显示打字员动作
$obj->typed();
}else{ //若非以上类,则显示出错信息
echo "Error: 对象错误!";
}
}

printworking(new painter()); //显示员工工作
printworking(new typist()); //显示员工工作

**

【示例】例举了采用多态的方式改写上例。其代码如下所示。

 

 

class employee{//定义员工父类
protected function working(){//定义员工工作,需要在子类的实现
echo "本方法需要在子类中重载!";
}

}

class painter extends employee{//定义油漆工类
public function working(){//实现继承的工作方法
echo "油漆工正在刷漆!\n";
}
}

class typist extends employee{//定义打字员类
public function working(){
echo "打字员正在打字!\n";
}
}

class manager extends employee{//定义经理类
public function working(){
echo "经理正在开会!";
}
}

function printworking($obj){//定义处理方法
if($obj instanceof employee){//若是员工对象,则显示其工作状态
$obj->working();
}else{//否则显示错误信息
echo "Error: 对象错误!";
}
}

printworking(new painter());//显示油漆工的工作
printworking(new typist());//显示打字员的工作
printworking(new manager());//显示经理的工作

 

 

 

分析:在上述程序中,首先定义一个员工基类,并定义一个员工工作状态的方法。然后定义将继承自员工基类的三个员工类:油漆工类、打字员类和经理类。然后定义显示员工工作状态的方法。并在该方法中创建一个“是一”关系,用于判断是否为合法的员工。其结果如下所示。

油漆工正在刷漆! 
打字员正在打字! 
经理正在开会!

从上例可发现,无论增加多少个员工类,只需要实现自员工父类继承的该员工类和方法。而无须修改显示员工工作状态的方法printworking()。

**


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值