来自:http://www.cnblogs.com/k5054/archive/2012/12/26/2834205.html

对于面向对象开发,抽象类与接口这两个东西是比较难理解的!

今天看了一整天!自己总结一下吧!

抽象类:是基于类来说,其本身就是类,只是一种特殊的类,不能直接实例,可以在类里定义方法,属性!类似于模版,规范后让子类实现详细功能!

接口:主要基于方法的规范,有点像抽象类里的抽象方法,只是其相对于抽象方法来说,更加独立!可让某个类通过组合多个方法来形成新的类!

抽象类与接口的相同点:

1、都是用于声明某一种事物,规范名称、参数,形成模块,未有详细的实现细节!

2、都是通过类来实现相关的细节工作

3、语法上,抽象类的抽象方法与接口一样,不能有方法体,即{}符号

4、都可以用继承,接口可以继承接口形成新的接口,抽象类可以继承抽象类从而形成新的抽象类

抽象类与接口的不同点:

1、抽象类可以有属性、普通方法、抽象方法,但接口不能有属性、普通方法、可以有常量

2、抽象类内未必有抽象方法,但接口内一定会有“抽象”方法

3、语法上有不同

1、抽象类用abstract关键字在类前声明,且有class声明为类,接口是用interface来声明,但不能用class来声明,因为接口不是类!

2、抽象类的抽象方法一定要用abstract来声明,而接口则不需要

3、抽象类是用extends关键字让子类继承父类后,在子类实现详细的抽象方法!而接口则是用implements让普通类在类里实现接口的详细方法,且接口可以一次性实现多个方法,用逗号分开各个接口就可

各自的特点:

抽象类内未必有抽象方法,但有抽象方法的类,则必是抽象类

抽象类内,即便全是具体方法,也不能够实例化,只要新建类来继承后,实例继承类才可以

接口可以让一个类一次性实现多个不同的方法

接口本身就是抽象的,但注意不是抽象类,因为接口不是类,只是其方法是抽象的!所以,其也是抽象的

应用与结合:

以下的代码是基于自己的思考,未在实际开发中应用,只是这种写法有点奇特!让抽象与接口结合起来!

<?php 
/* 
一、抽象类与接口的结合

写此程序源于自己的猜测,想在抽象类里实现某一接口! 
*/ 
interface work{ 
    public function say(); 
}

abstract class a implements work{ 
    public function showlove(){ 
        echo 'love you<br />'; 
    } 
}

class b extends a{ 
    public function say(){ 
        echo 'hello, i m in b'; 
    } 
}

$k=new b(); 
$k->say();

/* 
以上程序能正常执行 
普通类implements接口后,就变成了抽象类了,这就好像是直接给抽象类增加了一个抽象方法! 
*/

二、接口与继承的结合

父类是普通类,子类继承后,同时在了类里实现接口!

疑问:这样的做法是否有意义,在实际开发中是否有这样的应用??

*/ 
interface kk{ 
    public function say(); 
}

class a { 
    public function show(){ 
        echo '我是父类<br />'; 
    } 
}

class b extends a implements kk{ 
    public function say(){ 
        echo '我是继承A类,同时实现say接口的<br />'; 
    }

}

$b=new b(); 
$b->show();//我是父类

$b->say();//我是继承A类,同时实现say接口的

?>

php抽象与接口的区别[转载]的更多相关文章

  1. Java抽象与接口的区别

    Java抽象与接口的区别 答案方式一.简单来说,1.接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的, 2.另外,实现接口的一定要实现接口里定义的所有 ...

  2. java学习笔记(基础篇)—抽象与接口的区别

    抽象与接口的区别 一.抽象(abstract) 1. 抽象方法 1) 作用:定义规范 2) 抽象方法用来描述具有什么功能,但不提供实现. 3) 如果类中一个方法没有实现就要定义一个抽象方法. 2. 抽 ...

  3. 转载总结 C# 多态(虚方法,抽象,接口实现)

    前言:我们都知道面向对象的三大特性:封装,继承,多态.封装和继承对于初学者而言比较好理解,但要理解多态,尤其是深入理解,初学者往往存在有很多困惑,为什么这样就可以?有时候感觉很不可思议,由此,面向对象 ...

  4. java基础之接口(抽象类与接口的区别)

    概述 猫狗案例,我们想想狗一般就是看门,猫一般就是作为宠物了,对不.但是,现在有很多的驯养员或者是驯的,这应该属于经过特殊的培训训练出来的,对不.所以,这些额外的动作定义到动物类中就不合适,也不适合直 ...

  5. C#中抽象类和接口的区别与使用

    一.抽象类: 抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们.另外 ...

  6. Java面向对象的基本概念(对象、封装、继承、多态、抽象、接口、泛型)

    对象:是一个自包含的实体,用一组可识别的特征和行为来标识. 类:具有相同的属性和功能的对象的抽象合集.(类关键字class,首字母大写). 实例:就是一个真实的对象. 实例化:创建对象的过程,关键字是 ...

  7. C#虚基类继承与接口的区别

    类:定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { } class Cat:object { } C#中所有的类都是默认由object类派生来的,显示指定或 ...

  8. IEnumerator<TItem>和IEnumerator Java 抽象类和普通类、接口的区别——看完你就顿悟了

    IEnumerable 其原型至少可以说有15年历史,或者更长,它是通过 IEnumerator 来定义的,而后者中使用装箱的 object 方式来定义,也就是弱类型的.弱类型不但会有性能问题,最主要 ...

  9. Java中抽象类和接口的区别?

    深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的 ...

随机推荐

  1. python笔记一:函数的参数

    1.默认参数 def fun(x,y,z=3): sum=x+y+z return sum fun(1,2) 2.可变参数(两种方法定义) def fun(n): sum=0 for i in n: ...

  2. SystemProperties cannot be resolved错误

    单独用eclipse打开一个工程,出现SystemProperties.get()会出现SystemProperties cannot be resolved.错误 1. 引用SystemProper ...

  3. 《深入浅出Nodejs》笔记——模块机制(1)

    前言 这是我读<深入浅出Nodejs>的笔记,真是希望我的机械键盘快点到啊,累死我了. CommonJS规范 主要分为模块引用.模块定义.模块标识三个部分. 模块引用 上下文提供requi ...

  4. 【Nginx】初试反向代理:反向代理的原理和用途

    Nginx是一个轻量级的服务器,是一个俄罗斯的开发者开发的开源软件.Nginx具有占内存小.并发能力高的特点,底层采用epoll(Linux2.6+)和kqueue(FREEBSD)网络I/O模型,相 ...

  5. 子查询在INSERT语句中的应用

    在使用INSERT语句的时候,一般都是使用它向数据库中一条条的插入数据,比如: INSERT INTO MyTable(FId,FName,FAge)VALUES(1,"John" ...

  6. wannafly挑战赛14

    第一次打wannafly..觉得自己好菜啊... 题目描述 在三维空间中,平面 x = 0, y = 0, z = 0,以及平面 x + y + z = K 围成了一个三棱锥. 整天与整数打交道的小明 ...

  7. BZOJ 2395 [Balkan 2011]Timeismoney(最小乘积生成树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2395 [题目大意] 给出一张无向图,每条边上有a,b两个值,求生成树, 使得suma* ...

  8. 【最大权闭合子图】BZOJ1497[NOI2006]-最大获利

    [题目大意] 建立第i个通讯中转站需要的成本为Pi(1≤i≤N).另外公司调查得出了所有期望中的用户群,一共M个.关于第i个用户群的信息概括为Ai, Bi和Ci:这些用户会使用中转站Ai和中转站Bi进 ...

  9. [原创]MyEclipse2014全手动实现反向工程---解决手动整合ssh时发生的、在hibernate反向工程的时候找不到项目名的问题

    1.在MyEclipse2014中新建两个Web Project项目,名字分别为:Hibernate_manual和Hibernate_auto. 2.单击选中新建的Web项目Hibernate_au ...

  10. mysqldumper

    介绍 MySQL自身的mysqldump工具支持单线程工作,依次一个个导出多个表,没有一个并行的机,这就使得它无法迅速的备份数据. mydumper作为一个实用工具,能够良好支持多线程工作,可以并行的 ...