请解释一下什么时候我应该使用PHP接口,什么时候我应该使用抽象类?
我如何能改变我的抽象类在一个接口?
请解释一下什么时候我应该使用PHP接口,什么时候我应该使用抽象类?
我如何能改变我的抽象类在一个接口?
当前回答
当您希望强制在您的系统中工作的开发人员(包括您自己)在他们将要构建的类上实现一组方法时,请使用接口。
当你想强迫在你的系统中工作的开发人员(包括你自己)实现一组方法,并且你想提供一些基本方法来帮助他们开发他们的子类时,使用抽象类。
另一件需要记住的事情是客户端类只能扩展一个抽象类,而它们可以实现多个接口。因此,如果您在抽象类中定义行为契约,这意味着每个子类可能只符合一个契约。有时这是一件好事,当你想强迫你的用户程序员沿着特定的路径。其他时候就不好了。想象一下,如果PHP的Countable和Iterator接口是抽象类而不是接口。
当您不确定该走哪条路时(如下面的cletus所述),一种常见的方法是创建一个接口,然后让抽象类实现该接口。
其他回答
抽象类和接口之间的技术差异已经在其他答案中列出了。为了面向对象编程,我想在编写代码时对类和接口之间的选择添加一个解释。
类应该代表实体,而接口应该代表行为。
让我们举个例子。计算机显示器是一个实体,应该表示为一个类。
class Monitor{
private int monitorNo;
}
它的设计目的是为您提供一个显示界面,因此功能应该由接口定义。
interface Display{
void display();
}
正如其他答案中解释的那样,还有许多其他的事情需要考虑,但这是大多数人在编码时忽略的最基本的事情。
抽象类和接口的区别:
抽象类
抽象类可以提供一些功能,而将其余的功能留给派生类。
派生类可以重写基类中定义的具体函数,也可以不重写。 从抽象类扩展而来的子类在逻辑上应该是相关的。
接口
接口不能包含任何功能。它只包含方法的定义。
派生类必须为接口中定义的所有方法提供代码。 完全不同且不相关的类可以使用接口在逻辑上分组在一起。
只是想添加一个例子,说明什么时候你可能需要使用这两种方法。我目前正在编写一个通用ERP解决方案中绑定到数据库模型的文件处理程序。
我有多个抽象类,处理标准的crud,也有一些特殊的功能,如转换和流的不同类别的文件。 文件访问接口定义了一组用于获取、存储和删除文件的通用方法。
通过这种方式,我可以为不同的文件拥有多个模板,以及一组具有明显区别的公共接口方法。接口对访问方法进行了正确的类比,而不是对基抽象类的类比。
接下来,当我将为不同的文件存储服务制作适配器时,这种实现将允许在完全不同的上下文中在其他地方使用接口。
最佳实践是使用接口来指定契约,并将抽象类作为契约的一个实现。该抽象类可以填充大量样板文件,因此您可以通过重写需要或想要的内容来创建实现,而不必强制使用特定的实现。
当您希望强制在您的系统中工作的开发人员(包括您自己)在他们将要构建的类上实现一组方法时,请使用接口。
当你想强迫在你的系统中工作的开发人员(包括你自己)实现一组方法,并且你想提供一些基本方法来帮助他们开发他们的子类时,使用抽象类。
另一件需要记住的事情是客户端类只能扩展一个抽象类,而它们可以实现多个接口。因此,如果您在抽象类中定义行为契约,这意味着每个子类可能只符合一个契约。有时这是一件好事,当你想强迫你的用户程序员沿着特定的路径。其他时候就不好了。想象一下,如果PHP的Countable和Iterator接口是抽象类而不是接口。
当您不确定该走哪条路时(如下面的cletus所述),一种常见的方法是创建一个接口,然后让抽象类实现该接口。