interface

终于对接口有了一点理解。其实是非常简单的概念,但为什么看了那么多书都搞不明白,回头想想,除了自己的智商有限以外,还有其它原因:

  1. 大部分教程在讲解一个知识点的时候,都力求完整、准确、详尽,可是要本着这样的原则,没基础的话就很难看懂,可是有基础的话就不需要看入门教程;
  2. 由于上一条理由,我发现介绍接口的教程通常从语法开始,或者会说接口是一种约定等等。虽然这些都没错,但这些都不是最容易理解的入口。

我觉得对于任何入门教程来说,都不应该求准、求全,那是中级教程或参考书的事,而应该以最容易听懂为基本诉求点。

接口的存在,其实就是为了解决不能多重继承的问题。

因为C++以后的OO语言都不允许多重继承,即一个子类只能继承自一个父类,所以有时候会不太方便。典型的情况是:

例如,有两个父类:动物机器,从动物派生出子类,从机器派生出子类飞机,这个时候,如果要让飞机一起飞行,就是个麻烦。虽然可以在飞机这两个子类中各添加一个fly()方法,但是这两个子类毕竟分别属于两个不同的父类(除非推到object根上去),比如要创建飞行物体数组,就比较麻烦。

这个时候可以创建一个IFly接口,让飞机都使用这个接口。根据接口的语法规则,继承了接口就必须实现接口中定义的所有方法,假设IFly接口中定义了一个flying()方法,那么飞机就都必须各自实现flying()方法。

到这个时候为止,其实跟没有这个接口是一样的,就算不用这个接口,飞机也都有各自的flying()方法了,可以直接使用。那为什么非要用IFly接口呢?

这就是为什么说接口是一种约定的原因。有了这个约定,编译器才能认为你在飞机中一定是实现了flying()方法,所以它允许你使用IFly[]这样的数组,里面可以放或者飞机,然后统一调用它们各自的flying()方法。反过来说,如果没有这个约定,编译器就不确定或者飞机中是不是有flying()方法,既然不确定这两个类中是不是都有相同的方法,当然不允许创建数组或者统一调用flying()方法,要用可以,各用各的,别想一起用

到这里,就不好理解了。各用各的好理解,就是可以用eagle.flying();,也可以用plane.flying();,但到底什么叫一起用呢?

那是下一个话题了,总之有了接口这个约定,编译器就允许你做很多其它的事了。具体都能利用接口做什么,就涉及到很多其它功能和概念了。

在理解接口的练习中,发现对类的继承理解还不够透彻,以后还要继续巩固。一般书上都会说,子类会继承父类的所有成员,但是这是有很多各种各样的限制的,绝不是简单的你有我就有

接下来要攻克的理解难关是委托和事件

留言