V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
raincious
V2EX  ›  PHP

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

  •  
  •   raincious · 2014-07-08 11:56:23 +08:00 · 2466 次点击
    这是一个创建于 3778 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有一个模块的代码,类似这样:



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

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

    我想问的是:

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



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


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


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

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

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

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

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

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

    =>

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

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


    不能为了OO而OO,理论联系实际~~XD
    Actrace
        7
    Actrace  
       2014-07-08 21:40:54 +08:00
    少用这些东西。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2782 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:33 · PVG 19:33 · LAX 03:33 · JFK 06:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.