聊一聊面向接口编程。


  最近看Go语言的资料,看到interface类型,突然想起来以前面试的时候面试官问过我是否了解C++接口编程。当时对于这个问题,我脑袋里只有类?抽象类?这样模糊的答案。Bug产出者的我好像经常把接口当类和函数在写。现在再看这个问题,包括对面向对象,似乎明白了些。

从王者荣耀说开去

  比如玩王者荣耀,里面有各种英雄。比如智商250的鲁班七号,他会跑,攻击。
  面向过程的思维就是先定义一个结构体,里面有英雄的静态信息,比如名字、性别等等。“跑”、“攻击”这些动作让它发生,很简单啊,写一个run()和attack()的函数就好了。这时优秀的思维活跃的大佬们想,这个动作是鲁班本身就能发出的啊,不是我外界赋予的,这不够科学。
  于是面向对象诞生了。
  干脆写一个名为“LubanSeven”的类,把run()和attack()放入类里。
  此时对面迎来的敌人是扁鹊。
  他也会跑,攻击。于是还有一个名为“BianQue”的类,同样地,有run()和attack()两个方法。

  但是,这似乎很浪费代码。除了名字不同,他们的方法一样啊。
  优秀的思维活跃的大佬们说,要改。这样吧,鲁班七号是英雄,扁鹊也是英雄。干脆写个英雄的基类吧。鲁班七号类和扁鹊类继承它不就好了嘛!
  于是有了英雄类,类里有两个方法run()和attack()。

  英雄总归是要推塔的。于是还有一个防御塔类,防御塔也不是省油的灯,你靠近它它也会攻击的。所以里面也有个attack()方法。

  同是攻击,但英雄不会承认自己的攻击和防御塔的攻击是一回事。
  可是无聊的看客说,管它是什么,反正就是攻击就完事了,对方会掉血。
  那……这个攻击能不能放一块说?英雄表示拒绝(我又不是个塔),防御塔也闪光表示不服(我…又不是个人?)。
  这时优秀的思维活跃的大佬们又说话了。
  得了得了,我给你们写个接口吧。这个接口就叫做攻击,你们都可以用。
  甚至,水晶都可以用。

  这样一来,好像是更抽象了有没有?
  把不同类别的事物的相同特性摘出来,就是接口。使用者可以忽略细节。就像人会吃,猪也会吃。干脆接口就叫吃,下次有个猫来了,也可以调用。

  例子讲完。

总结

  C++貌似是没有接口这个狭义的语法概念的,但是我们依然可以写出类似于java里的interface这样的设计概念(使用纯虚函数)。

  面向过程编程(Procedure Oriented Programming, POP)对应的是面向对象编程(Object Oriented Programming, OOP)面向接口编程(Interface Oriented Programming, IOP)对应的是面向实现编程(Realize Oriented Programming, ROP)
  面向过程编程把世界分为数据结构和函数,追求过程一步步实现,面向对象编程把世界分为对象和方法。
  面向实现编程面向接口编程都是基于面向对象编程来谈的。
  面向实现编程就是在自身类中实例化该类,直接调用相应方法。耦合度高。
  面向接口编程主要是为了将定义和实现分开,提高了代码的解耦度,复用性强,便于扩展,能够更好的维护。
  所有的思想本质都是模拟现实。

  之前分不清抽象类接口的区别,但现在觉得抽象类是广义的用法,而其中针对某些特定功能实现的抽象类就可以称之为接口,或者说接口更侧重于定义规则。比如高考学生类、考研学生类它们的抽象类是学生类,而其中一个接口是“考试”。

参考文章

https://www.cnblogs.com/moveofgod/archive/2013/05/08/3066325.html
https://blog.csdn.net/u013400743/article/details/51252003
https://blog.csdn.net/qq_35923749/article/details/78422977