嗯……我来问个基础问题,关于 Interface 的用法。

2014-07-08 11:56:23 +08:00
 raincious
有一个模块的代码,类似这样:

https://gist.github.com/raincious/86c14dc24c461d228ee6

“自行车”和“摩托车”两个对象共同继承自“两轮车”这个抽象类。

现在有个问题,“自行车”和“摩托车”两个对象除了“骑”方法外,还有各自有一个不同的方法,分别是“踩脚蹬”和“发动”。

我想问的是:

1、这样符合最佳实践么?
2、如果符合,那么是否需要分别再给两个子类定义接口?比如:

https://gist.github.com/raincious/2b770f392b7f0191eb8a

然后让那两个子类分别implements他们?


之前搜到了这个: http://stackoverflow.com/questions/22096141/is-it-good-practice-for-every-public-method-to-be-covered-by-an-interface 但是没有回答被接受,所以还是不明。


请大家解答下,谢谢!
2500 次点击
所在节点    PHP
7 条回复
amon
2014-07-08 12:10:18 +08:00
多态
yxz00
2014-07-08 12:14:28 +08:00
当然可以把每个类公共方法都给个interface。但是你这样写得累死。这样你一改公共接口就要改interface + public method。而且一个类方法多了,你的接口列表不得写出几个屏幕去。

这是中了oo理论的毒。当一个接口没有多态的需求的时候就不要给interface。等以后有了再加不迟。

当然你可以用golang,就永远不用纠结这个问题了。隐式接口是我最喜欢的golang特性。当然好多人会跳出来说,“这是图灵等价的”。
yxz00
2014-07-08 12:16:29 +08:00
还有,我同事命名要用中文,我直接拿凳子抽死他。
dustinth
2014-07-08 12:22:02 +08:00
没有不需要任何条件的所谓Best Practice. 任何事情, 只要问一下"为什么这么做", 答案就明了了.
raincious
2014-07-08 12:27:19 +08:00
好吧,我又看了几个SO的回答,于是其实这样就把问题解决了:

https://gist.github.com/raincious/a3abc04f0b764f8c501d

刚才怎么没想到,我好笨啊,呵呵
jevonszmx
2014-07-08 15:47:16 +08:00
我的理解:
我要造“两轮车”,“两轮车”必须要有一个什么功能呢?“骑”。
=>
可是万一有的人造的“两轮车”,不能”骑“怎么办?所以要约束下,所以我们查到:

接口:使用接口(interface),你可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

=>

这样的话,我们定义一个”两轮车“的interface,约束了”骑“这个方法,这样,不管是“自行车”和“摩托车”,只要是”两轮车“,必须起码实现”骑“这个功能才可以。

注意:我用的”起码“,也就是说其他的并没约束,每个对象还可以有自己的特点,”自行车“可以“踩脚蹬”,”摩托车“可以“发动”,这就是”多态“。


不能为了OO而OO,理论联系实际~~XD
Actrace
2014-07-08 21:40:54 +08:00
少用这些东西。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/121519

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX