面向对象中接口的意义

前言

1.这篇文章仅限于对php的面向对象进行说明,其他语言的情况不再考虑之列。
2.本人学生,难免有不足之处,希望各位大神指出。


正文

当我们在刚开始学习php这门语言的面向对象时,我们难免会对接口感觉到很陌生,因为它仅仅可以用来实现,而看起来任何意义,它不像继承一样可以让我们的类增加许多新的方法和属性,比如下面这种代码

Icalculate.php
<?php
interface Icalculate
{
    public function add($value1, $value2);
    public function ave($value1, $value2);
}```
现在有一个类实现了它

Calculate.php
<?php
include "Icalculate.php";
class Calculate implements Icalculate
{
public function add($value1, $value2)
{
return $value1 + $value2;
}

public function ave($value1, $value2) 
{
    return ($value1 + $value2) / 2;
}

}```
很多萌新看到后会想,这种接口,要不要是一样的,为什么还要存在呢?确实,让我们去掉接口

class Calculate 
{
    public function add($value1, $value2) 
    {
        return $value1 + $value2;     
    }   
    
    public function ave($value1, $value2) 
    {
        return ($value1 + $value2) / 2;
    }
}```
这样的代码也是完全可以的,甚至说还减少了由于实现接口不当而造成程序语法错误的几率。但是真的接口就像上面的例子一样毫无用处吗?我可以很明确的说不是的,因为东西肯定是要有意义才会存在。
***
####用于合作
我们不妨考虑一下这样的情况:小明和小红<b>合作</b>写一个程序,目的是要实现输入两个数,求出最后的和以及平均数。小明说他来写加法的类,而小红去写数据的获得和输出。考虑一下如果没有接口,小红可能会这样写

index.php
<?php
include "Calculate.php";
$v1 = $_POST['v1'];
$v2 = $_POST['v2'];
$Cal = new Calculate();
echo $Cal->plus($v1, $v2).'
';
echo $Cal->average($v1, $v2);

而小明写的代码如同一开始举的例子那样,这两个文件放在一起,程序是不能执行的,错误会是这样

Fatal error: Uncaught Error: Call to undefined method
Calculate::plus() in /home/frog/PHPCode/index.php:6```
原因大家都懂,Calculate这个类没有plus这个方法,虽然add和plus这两个单词都有加的意思,但是很显然小明却没有像小红想得那样命名方法,所以最后导致了错误。但是在有接口的情况下,只要小红正确的使用接口,错误就不会发生。


可替换性

接着上面的例子,如果将来哪一天,小明觉得自己的类写的不好,不能够记录算出来的结果,他想改改自己的类而又不能影响原来程序的运行。在有接口的情况下是非常简单的,因为他知道了那些东西要保留。

Calculate.php
<?php
// 修改之后的Calculate类
include "Icalculate.php";
class Calculate implements Icalculate 
{
    protected $result;

    public function getLastResult() {
        return $this->result;
    }    

    public function add($value1, $value2) 
    {
        $this->result = $value1 + $value2;
        return $this->result;     
    }   
    
    public function ave($value1, $value2) 
    {
        $this->result = ($value1 + $value2) / 2;
        return $this->result;
    }
}```
现在修改完原来的代码之后,程序可以运行,而且新的功能也实现了,现在可以通过`getLastResult`方法来获得上一次的运行结果。
***
####总结
虽然上面的例子看起来都很容易,但是如果把合作的人数放大10倍,每个人的工作量放大100倍,那么接口的意义就会更加明显。如果每个人都使用自己的命名方式,光是在开发调试时改变量名就会是巨大的挑战,而对于修改自己的代码来说也是这样,是一场灾难。所以说推荐大家在写自己的代码的时候先想好接口再手,这样才能在后期的维护中省不少心。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,530评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,256评论 19 139
  • 五月二十一号 星期天 天气晴 期待已久的写生课今天终于来到了,早上和小伙伴们一块出发去潍坊-东方乐园,老师一...
    楚亦菲妈妈阅读 85评论 0 0