面向对象特性-多态

(1)抽象类和方法

只在父类中声明,在子类中实现,用abstract声明。作用是给子类作规范。

规则:抽象类不能实例化,只能被继承;抽象方法必须被子类方法重写。

创建:

	abstract class Computer{

	}

抽象类里面的抽象方法必须在子类里面重写,不然会报错。

	abstract class Computer{
		abstract public function _run();
	}

	class NoteComputer extends Computer{
		//抽象类里面的抽象方法,必须在子类里面重写
		public function _run(){
			echo '我是子类里的方法';
		}
	}

抽象类里面的普通方法不需要重写,子类会自动继承下来。

只要类里面有一个抽象方法,那么这个类必须是抽象类,类前面必须加上abstract;反之也是,抽象类里面要有抽象方法,不然里面要加上抽象干嘛呢。

抽象类里面也是可以有正常的字段的。

类只支持单继承,不能实现多继承的。


(2)接口(interface)

接口是一种特殊的抽象类,也是不能实例化的。

接口定义了实现某种类的一般规范,声明了所需的函数和常量,但不指定如何实现。

接口是为了规范实现它的子类,以达到统一的目的。

规则:类里面全部为抽象方法(不需要声明abstract),没有方法体;接口抽象方法必须是public;成员(字段)必须是常量。

定义为:

	interface Computer{
		const NAME = '联想';
		public function _run();
		public function _run2();
	}

使用接口常量:

	echo Computer::NAME;
子类继承接口的说法,叫做实现。

	class NoteComputer implements Computer{
		public function _run(){
			echo '我重写了_run';
		}
		public function _run2(){
			echo '我重写了_run2';
		}
	}
接口是可以多实现的。

	interface Computer{
		const NAME = '联想';
		public function _run();
		public function _run2();
	}

	interface Computer2{
		public function _run3();
	}


	class NoteComputer implements Computer,Computer2{
		public function _run(){
			echo '我重写了_run';
		}
		public function _run2(){
			echo '我重写了_run2';
		}
		public function _run3(){
			echo '我重写了_run3';
		}
	}
如何选择抽象类和接口呢?如果是要继承多个类的方法规范,就用接口;如果要共享一个方法体内容,就用抽象类。


(3)多态

接口的多种不同的实现方式即为多态。把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

多态,多种形态。

一个动作由不同的人去执行,而产生不同的效果或者结果,即为多态。

一个人通过不同的状态去执行同一种动作,形成不同的结果,也可以称作为多态。

多态原理,就是类写好啦,不要去修改它,只要在类外的调用参数的更改

<?php

	//园丁	剪	修理花草
	//理发师剪	理发
	//总裁	剪	裁员

	// 人	笔记本	运行	win7开机了
	// 人	台式机	运行	xp开机了

	interface Computer{
		public function version();//这个方法表示采用什么电脑
		public function work();//这台电脑是怎么运行的
	}

	//创建一个笔记本类来实现接口
	class NoteComputer implements Computer{
		public function version(){
			echo '笔记本';
		}
		public function work(){
			echo '可以便携式运行win7';
		}
	}
	//创建一个台式机的类来实现接口
	class DesktopComputer implements Computer{
		public function version(){
			echo '台式机';
		}
		public function work(){
			echo '在工作站运行xp';
		}
	}

	class Person{
		//创建一个方法来接收电脑
		//将它们的对象传递进来就好啦
		public function _run($type){
			echo '此人的';
			$type->version();
			$type->work();
		}
	}

	$notecomputer = new NoteComputer();

	$desktopcomputer =new DesktopComputer();

	$person = new Person();
	$person->_run($notecomputer);//这种传递,叫做对象引用的传递
?>



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值