interface
终于对接口有了一点理解。其实是非常简单的概念,但为什么看了那么多书都搞不明白,回头想想,除了自己的智商有限以外,还有其它原因:
- 大部分教程在讲解一个知识点的时候,都力求完整、准确、详尽,可是要本着这样的原则,没基础的话就很难看懂,可是有基础的话就不需要看入门教程;
- 由于上一条理由,我发现介绍接口的教程通常从语法开始,或者会说接口是一种约定等等。虽然这些都没错,但这些都不是最容易理解的入口。
我觉得对于任何入门教程来说,都不应该求准、求全,那是中级教程或参考书的事,而应该以最容易听懂为基本诉求点。
接口的存在,其实就是为了解决不能多重继承的问题。
因为C++以后的OO语言都不允许多重继承,即一个子类只能继承自一个父类,所以有时候会不太方便。典型的情况是:
例如,有两个父类:动物和机器,从动物派生出子类鹰,从机器派生出子类飞机,这个时候,如果要让鹰和飞机一起飞行,就是个麻烦。虽然可以在鹰和飞机这两个子类中各添加一个fly()方法,但是这两个子类毕竟分别属于两个不同的父类(除非推到object根上去),比如要创建飞行物体数组,就比较麻烦。
这个时候可以创建一个IFly接口,让鹰和飞机都使用这个接口。根据接口的语法规则,继承了接口就必须实现接口中定义的所有方法,假设IFly接口中定义了一个flying()方法,那么鹰和飞机就都必须各自实现flying()方法。
到这个时候为止,其实跟没有这个接口是一样的,就算不用这个接口,鹰和飞机也都有各自的flying()方法了,可以直接使用。那为什么非要用IFly接口呢?
这就是为什么说接口是一种约定的原因。有了这个约定,编译器才能认为你在鹰和飞机中一定是实现了flying()方法,所以它允许你使用IFly[]这样的数组,里面可以放鹰或者飞机,然后统一调用它们各自的flying()方法。反过来说,如果没有这个约定,编译器就不确定鹰或者飞机中是不是有flying()方法,既然不确定这两个类中是不是都有相同的方法,当然不允许创建数组或者统一调用flying()方法,要用可以,各用各的,别想一起用。
到这里,就不好理解了。各用各的好理解,就是可以用eagle.flying();
,也可以用plane.flying();
,但到底什么叫一起用呢?
那是下一个话题了,总之有了接口这个约定,编译器就允许你做很多其它的事了。具体都能利用接口做什么,就涉及到很多其它功能和概念了。
在理解接口的练习中,发现对类的继承理解还不够透彻,以后还要继续巩固。一般书上都会说,子类会继承父类的所有成员,但是这是有很多各种各样的限制的,绝不是简单的你有我就有。
接下来要攻克的理解难关是委托和事件。