特质 vs 接口

394

我最近一直在努力学习PHP,但是我发现我对traits这个概念有些困惑。我理解水平代码复用的概念,以及不一定要从抽象类中继承的想法。但我不明白的是:使用traits和使用接口之间的关键区别是什么?

我尝试搜索一些不错的博客文章或者是解释何时使用其中一个而不是另一个的文章,但是到目前为止我找到的例子都很相似,甚至可以说是一模一样。


6
接口中的函数体内没有任何代码。实际上,它们并没有任何函数体。 - hakre
3
尽管我的回答得到了很多赞,但我想记录一下我通常是反对特质/混入的。查看此聊天记录以了解特质通常如何削弱良好的面向对象编程实践。 - user895378
2
我持相反观点。在 traits 出现之前和之后,我已经使用 PHP 工作多年,我认为很容易证明它们的价值。只需阅读这个实际例子,它使“图像模型”也能像 Imagick 对象一样行走和交谈,而不需要在 traits 出现之前所需的所有臃肿代码。 - quickshiftin
1
特质和接口类似,主要区别在于特质允许你实现方法,而接口则不允许。 - John
接口就像需求,特征就像附加组件。顺便说一下,Java、Kotlin和Rust将特征和接口合并成了同一种东西。 - quant2016
接口就像需求,特质就像附加功能。顺便说一下,Java、Kotlin和Rust将特质和接口合并为一个东西。 - quant2016
13个回答

1
一个接口是一份合同,它表示“这个对象能做这件事”,而特征则赋予了对象做这件事的能力。
特征本质上是在类之间“复制粘贴”代码的一种方式。 尝试阅读这篇文章,什么是PHP特征?

1
主要区别在于,使用接口时,必须在实现该接口的每个类中定义每个方法的实际实现,以便您可以有许多类实现相同的接口但具有不同的行为,而Trait只是注入类中的代码块;另一个重要区别是Trait方法只能是类方法或静态方法,而接口方法也可以(通常是)实例方法。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接