多用组合少用继承中,接口继承算不算一种组合?

扣子面意思中接口继承应该也算继承,而我认为实际上接口的使用或者说类似抽象类的多继承实际上就是解决的是组合的问题,而直接用A has B虽然是组合,但实…
关注者
106
被浏览
31,793
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

所有问题抛开具体的应用场景都是没法准确回答的。

拿我熟悉的游戏服务器领域来说,以前用得很多的模式是:把游戏中一切事物抽象为实体(基类),从实体继承下来的有场景,角色,掉落物等等;从角色继承下来的有怪物,玩家,NPC等等,由此形成一个继承树。是不是觉得很自然?

但现在慢慢不这么做了,因为通过继承很难把功能很好的切分,比如怪物有技能,玩家也有技能;怪物有AI,NPC也有AI;如果仍然使用继承的方式,要么角色类包含所有这些函数接口,然后子类具体实现;要么再分子类,比如带AI的角色,带技能的角色,然后再从这些子类继承出怪物。。。,最终你会发现整个继承树很深很复杂。

现在的做法是组件化:

  • 一切游戏对象仍然叫实体,但它已没有具体的逻辑,它只负责管理组件。
  • 每种组件实现具体的功能,比如技能组件,AI组件,序列化组件。。。
  • 将不同的组件集成到不同的实体上,就形成不同的游戏对象。比如怪物实体,它有技能组件,有AI组件,有位置组件。玩家实体有技能组件,有序列化组件,有与客户端通讯的网络组件。。

通过组件化,服务器构架的灵活性大大提高了,你说这算不算一种组合的优点呢?

上面是多用组合少用继承的回答,另一个是:接口继承算不算一种组合?

不算,接口继承这个听着有点怪怪的,叫接口实现比较好吧?指明实现该接口的类需要实现的函数集,算是一种契约吧。