聊一聊面向接口编程。
最近看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