今天早些时候,我正在研究PHP的abstract classes,interfaces和traits。
据我所知,一个抽象类说“任何使用我的东西都会使用这些方法和属性”,界面说“任何使用我的东西都必须有这些方法和属性”,而且特征说“任何使用我的东西也会有这些方法和属性“。
现在,我的问题是,如果在使用接口和特征时获得等效的抽象类,为什么会有抽象类?
如果我错了,界面和特征不等同于抽象类,你能解释一下为什么不是这样吗?
答案 0 :(得分:34)
我认为在如何以及何时使用它们方面存在一些哲学上的差异。
你说:
如果你专注于你自己的措辞,这是有道理的。
抽象类实际上定义了抽象的内容,例如,除非具体化形式为汽车或自行车。界面既不定义它也不定义特征。
接口补充了类继承功能,其中一个类从多个类继承(只有某些语言提供多重继承,例如C / C ++)。接口,如名称所示,侧重于INTERFACE,而不是实现它的类中接口方法的实现。它使类 PLUG&可播放所以每个人都应该遵循标准。如果您在OOP上进一步了解工厂和适配器模式,您将理解它。
Traits 具有未绑定到特定类的实现/功能。相反,它可以在不同的类中找到。它就像遗传基因一样,在父母身上保持沉默,只出现在某些孩子身上。或者简明扼要选择性继承但不限于单个类。因此,它提供了一种更好的方法代码重用
修改强>
Interface + Trait!=抽象类,因为在使用Trait继承时selective
选择要使用的特定特征,而使用Abstract Class
继承是强制性的或由父类决定,你没有自由!
答案 1 :(得分:14)
这有点像说浮点数是否存在,为什么存在整数,它们都有自己的特定用途,但更重要的是看看PHP的历史会对此有所了解:
PHP最初是在没有任何类支持的情况下构建的,并且多年来越来越多地添加了PHP以扩展PHP的功能,因为我们进一步推动它(并且有争议的游戏赶上其他基于OOP的语言)
2004 - 引入抽象类和接口
2012年 - 介绍了特征
这是一个8年的休息时间,在那段时间内需要增加对interfaces with implementations的支持,因此这个特性诞生了
答案 2 :(得分:1)
当你使用traits时,你只需要一个给定的类来实现一些方法。
您不会继承任何属性或方法,也不会强制该对象进入任何继承树。
因此,您可以使用相同的特征来拥有几个完全不相关的类,只是为了保证这些类的任何对象都支持给定的方法。
这就是PHP如何着名的Mixins。 基本上,Mixin只是一个可以与其他几个类共享共同特征的类。 Traits允许对类的方法强制执行该约束,而与这些类是否相互继承的方式无关。
当你想要一个类来组合两个父母的行为时,你可以使用特征来获得相同的结果,而不必麻烦一些不必要的其他事情。<\ n>而不是必须做多次继承到愚蠢的点。 / p>