PHP:Concept of interfaces?
有人能用很好的例子解释接口的概念吗?我搜索了一下,但没有找到一个好答案。我仍然对这些概念感到困惑。
我找到了一个Internet接口示例,如下所示。代码在没有具有相同输出的接口的情况下工作。那么它的目的是什么呢?或者它不是接口的真正实现?.I需要从过程编码转向面向对象编程。如果没有人能用更复杂的技术词汇来解释,那就更好了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php interface IPillage { public function emptyBankAccounts(); public function burnDocuments(); } class Employee { public function emptyBankAccounts() { echo"Call employees and ask to transfer funds to Swiss bank account"; } public function burnDocuments() { echo"Torch the office suite of the employee"; } } class Executive extends Employee implements IPillage { public function emptyBankAccounts() { echo"Call executive and ask to transfer funds to Swiss bank account"; } public function burnDocuments() { echo"Torch the office suite of the executive"; } } $obj1=new Employee(); $obj2=new Executive(); $obj1->emptyBankAccounts(); echo ''; $obj2->emptyBankAccounts(); ?> |
许多语言只允许单一继承,有了接口,您就可以拥有一种多重继承…您可以从基类继承,同时也可以从许多接口继承。例如,您可以有许多类,如..人,动物,卡车。当然,它们是不同的,但是它们可以用一个名为"to move"的方法实现类似"movable"的接口。在这种情况下,我可以参考三种不同的物体从光学的"可移动元件"。我可以说我的人类。移动/我的猴子。移动/我的卡车。移动……我确信我可以请求移动到任何实现可移动接口的对象,而不必关心特定对象可以做的其他事情…为了考虑一个接口,我必须考虑它们提供的功能。对不起,我是阿根廷人。尼古拉斯·佩里克恩
正如Prades所写,创建接口创建了一种契约。这确实是这里的关键概念。
假设您正在与其他开发人员团队一起开发一个项目。有几个新的类需要编写,团队希望就一个通用的方法/设计模式达成共识。每个人都同意这些类都需要一个foo方法、一个bar方法和一个baz方法。这些方法将如何工作的具体细节在每个类中都会略有不同。但是,它们应该具有相同的签名。
我们决定创建一个接口,命名每个类应该拥有的方法(foo、bar、baz)和它们的签名(即它们采用的参数)。现在,当我们每个人编写这些新类中的一个时,我们将"实现"接口。通过声明"myClass"实现"myInterface",我们现在需要在我们的类中实现foo、bar和baz方法。如果不这样做,我们的IDE、编译器、运行时环境等将抛出一个错误。
接口:
无法实例化。是一种特殊类型的抽象类,其中所有成员都没有任何实现。启用多态性。类可以实现多个接口。通常用于应用程序类:为确保交互性提供契约。
目标:确保某些东西可以互换。实现接口的类需要包含所有实现,否则编译器将抛出错误。能干的关系。例如,学生可以报名,学生可以提交作业。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | public interface ICanEnrol { void Enrol(); } public interface ICanSubmit { void Submit(); } public class Student : ICanEnrol, ICanSubmit { public void Enrol() { School.Send("enrolment"); } public void Submit() { School.Send("report"); } } public class Employee : ICanEnrol, ICanSubmit { public void Enrol() { Company.Send("enrolment"); } public void Submit() { Company.Send("report"); } } |