论坛首页 Java版

讨论interface在java编程中的作用

浏览 28706 次
该帖已经被评为精华帖
作者 正文
最后更新时间:2004-09-27
引用
interface最大的作用,是提供对于一个类的多种可能的视角

我不认同这个说法。

你还是在围绕着你的"class implements interface"的视角说话。而这在interface的使用中属于次要地位。
为什么你不肯看看"declare requirements as interface and use interface directly"这样一个“即声明即用”的模式呢?


"implements SomeInterface"虽然是必要的,但是毕竟仍然是用来建立类和接口的关系的。也就是说,仍然是和实现细节相关的,模块内部的东西。
在另一篇帖子里我就曾经强调过,一个类implements一个接口还是同时implements两个接口,对于结构设计来说,并不重要,只不过是类内部的实现细节。

interface的作用在于把规范,协议这些东西作为first-class的类型使用。它唯一的作用就是帮你解耦。
把“类型”和“类”分开来看待。
interface的最大作用,不在于可以给“类”提供什么东西,而是在于可以让你忘掉“类”,忘掉实现,直接面对规范,协议。

简要地说:interface的重要性在于它本身的抽象性。而不在于"implements"这个keyword。
凡是谈到和“类”相关的任何东西,都不是最重要的。

另外,说“如果没有继承的概念,那么就会需要写很多重复的代码”,我也是不同意的。不用继承,用接口组合,也可以达到类似的功能的。而且更灵活。
   
0 请登录后投票
最后更新时间:2004-09-27
系统架构在接口规范上,这个是一种非常理想化的情形。
如果追究这些接口定义的由来,事情立马变得复杂很多。在一些开发过程中,接口是通过不断重构逐渐浮现出来的。
规范和实现的关系问题,这个问题,hehe, 取决于用静态的角度还是动态的角度来看。
而且,java中的接口本身起不到一个规范的作用。它的语义是定义在另外一些地方的(如果有明确定义的话),不是一个自足的概念。
   
0 请登录后投票
最后更新时间:2004-09-27
Trustno1 写道
老庄,你要是扯其他的我不管。你要是和ajoo扯面向对象的理论,我觉得你就亏大了。
http://www.allaboutprogram.com/viewtopic.php?t=304&highlight=%C3%E6%CF%F2%B6%D4%CF%F3
这是咱们Ajoo兄翻译过来的西域武功秘籍。我老早就冒着10几把扫帚的危险从ABP的藏经格里偷过来,sigh你就是不化功夫练习,你看这不就是走火入魔了不是,还算好没有逆经倒行哈哈。赶快赶快,抱佛脚还来得及。


唉,如果我说的东西不是原创,我又何必提醒大家打起精神呢?
如果我说的东西和OO教科书的一样,我又何必说呢?

再说了,就算ajoo翻译了OO的西域秘笈,也并不等于ajoo就完全同意那个人的观点。可见OO也不是已经“无需再争论”的理论啊。
   
0 请登录后投票
最后更新时间:2004-09-27
to:ajoo

我的那篇文章是第一篇,讨论的问题是:类、抽象类、接口这些概念的来历,也可以掉个文,称之为这些“keyword的基本语义”。

在这样的对于基本语义的统一认识的基础上,才能够谈到使用问题,我会接着写的。这里解释两点:

1、interface只是一个“二维的表面”,这样的表面任何一个三维的立体都本来就有。而给一个三维的立体贴上另外的表面,不能称之为协议。如果你只是声名一个interface,而没有一个(哪怕是一个MOCK)对象来实现它,你是不可能真正开始使用你的类的。

    a、编写接口
    b、编写自己的类
    c、编译通过
然后呢?如果没有一个具体实现的类,你自己的这个类能够通过测试吗?“即声明即用”意义何在?

2、“组合优于继承”这是当然,但是我要解释的是继承这个语义,当年出现的原因,也就是说“继承是因什么原因而出现的。”
   
0 请登录后投票
最后更新时间:2004-09-27
庄表伟 写道
相对于多重继承的“加法”,interface不是,也不可能给一个class带来新的实质内容,而只是提供了多重的视角。

难道庄兄是说:
[code:1]public class A {
    public void doThingA() {
   }
   public void doThingB() {
   }
}
//I need a view of doThingA()
public interface AI {
    void doThingA();
}

//oh!I has to change my class A
public class A implements AI {
   //nothing hanppened in here!
}

//some days elapsed,now I nee a doThingB() view

public interface ABI {
   void doThingB();
}
//my god!I had to...
public class A implements AI,ABI {
}[/code:1]
这种自底向上也太夸张了吧?
   
0 请登录后投票
最后更新时间:2004-09-27
我认为java中抽象类和接口有互相辅助的作用,之所以要分开处理,是出于语法简单性的考虑。
接口提供了抽象,但接口对实现有严格的要求,但抽象类可以把这种严格的程度降下来,也就是adapter pattern中的那个空的stub,它在语法上提供了抽象的实现,但语义上没有任何内容,我们当然不会希望有人实例化这样的类来用,所以可以把它声明为abstraction的类。
还有,当代码中出现hook的时候,也是抽象,super class没有制定具体的hook提供者,而subclass则可以指定具体的hook提供者是谁,然后可能做些特殊的处理。

ajoo很伟大!为大家翻译西域秘籍,向ajoo学习!
   
0 请登录后投票
最后更新时间:2004-09-27
ajoo 写道
引用
interface最大的作用,是提供对于一个类的多种可能的视角

我不认同这个说法。

你还是在围绕着你的"class implements interface"的视角说话。而这在interface的使用中属于次要地位。
为什么你不肯看看"declare requirements as interface and use interface directly"这样一个“即声明即用”的模式呢?


"implements SomeInterface"虽然是必要的,但是毕竟仍然是用来建立类和接口的关系的。也就是说,仍然是和实现细节相关的,模块内部的东西。
在另一篇帖子里我就曾经强调过,一个类implements一个接口还是同时implements两个接口,对于结构设计来说,并不重要,只不过是类内部的实现细节。

interface的作用在于把规范,协议这些东西作为first-class的类型使用。它唯一的作用就是帮你解耦。
把“类型”和“类”分开来看待。
interface的最大作用,不在于可以给“类”提供什么东西,而是在于可以让你忘掉“类”,忘掉实现,直接面对规范,协议。

简要地说:interface的重要性在于它本身的抽象性。而不在于"implements"这个keyword。
凡是谈到和“类”相关的任何东西,都不是最重要的。

另外,说“如果没有继承的概念,那么就会需要写很多重复的代码”,我也是不同意的。不用继承,用接口组合,也可以达到类似的功能的。而且更灵活。


我持和ajoo相同的观点。
interface 的作用在于尽可能的在区分构造和实现。interface 最大的用处是用来构造模型,而不是成品。我个人认为应该要有这种心态。否则可能会误解接口的本质。

我觉得接口体现多视角这种说法并不精当,更好的做法是把接口作为概念模型的工具。
   
0 请登录后投票
最后更新时间:2004-09-27
引用
只是声名一个interface,而没有一个(哪怕是一个MOCK)对象来实现它,你是不可能真正开始使用你的类的

这话没错是没错(当然,还得看你怎么定义"使用"这个词.没有实现类,我也可以写我的接口的使用类)

但是,有什么意义呢? 没有main(),你的所有的类都不可能最终运行,那么难道我们说什么设计都要扯到main()吗?


人不吃饭都得饿死,难道我们讨论编程的时候能说oo的主要方面在于吃饭?

“即声明即用”意义何在?
我上星期写了一个检测输入错误的模块. 我自己定义了接口StringMap来表示外界的输入(很可能从HttpServletRequest).
我完成了代码. 编译通过. 然后自己用HashMap来adapt出来一个StringMap来单元测试.
代码测试完成后. 交给别人, 别人只要把HttpServletRequest adapt成StringMap就成了.
   
0 请登录后投票
最后更新时间:2004-09-27
使用:能够被单元测试。

不要往main上扯,更不用谈到吃饭。
   
0 请登录后投票
最后更新时间:2004-09-27
to:wuhaixing

你的例子,不是自底向上,而是需求的变更。当你有了一个class A。你就有了需要的功能,但是当你需要对这个class A有另外的看法时,你可以定义一个interface甚至多个interface,将它“贴”到这个class A上。

如果这样的需求没有出现,那么interface就是没有必要的。
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐