|
该帖已经被评为精华帖
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间: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。 凡是谈到和“类”相关的任何东西,都不是最重要的。 另外,说“如果没有继承的概念,那么就会需要写很多重复的代码”,我也是不同意的。不用继承,用接口组合,也可以达到类似的功能的。而且更灵活。 |
|
| 返回顶楼 | |
|
最后更新时间:2004-09-27
系统架构在接口规范上,这个是一种非常理想化的情形。
如果追究这些接口定义的由来,事情立马变得复杂很多。在一些开发过程中,接口是通过不断重构逐渐浮现出来的。 规范和实现的关系问题,这个问题,hehe, 取决于用静态的角度还是动态的角度来看。 而且,java中的接口本身起不到一个规范的作用。它的语义是定义在另外一些地方的(如果有明确定义的话),不是一个自足的概念。 |
|
| 返回顶楼 | |
|
最后更新时间: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也不是已经“无需再争论”的理论啊。 |
|
| 返回顶楼 | |
|
最后更新时间:2004-09-27
to:ajoo
我的那篇文章是第一篇,讨论的问题是:类、抽象类、接口这些概念的来历,也可以掉个文,称之为这些“keyword的基本语义”。 在这样的对于基本语义的统一认识的基础上,才能够谈到使用问题,我会接着写的。这里解释两点: 1、interface只是一个“二维的表面”,这样的表面任何一个三维的立体都本来就有。而给一个三维的立体贴上另外的表面,不能称之为协议。如果你只是声名一个interface,而没有一个(哪怕是一个MOCK)对象来实现它,你是不可能真正开始使用你的类的。 a、编写接口 b、编写自己的类 c、编译通过 然后呢?如果没有一个具体实现的类,你自己的这个类能够通过测试吗?“即声明即用”意义何在? 2、“组合优于继承”这是当然,但是我要解释的是继承这个语义,当年出现的原因,也就是说“继承是因什么原因而出现的。” |
|
| 返回顶楼 | |
|
最后更新时间: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] 这种自底向上也太夸张了吧? |
|
| 返回顶楼 | |
|
最后更新时间:2004-09-27
我认为java中抽象类和接口有互相辅助的作用,之所以要分开处理,是出于语法简单性的考虑。
接口提供了抽象,但接口对实现有严格的要求,但抽象类可以把这种严格的程度降下来,也就是adapter pattern中的那个空的stub,它在语法上提供了抽象的实现,但语义上没有任何内容,我们当然不会希望有人实例化这样的类来用,所以可以把它声明为abstraction的类。 还有,当代码中出现hook的时候,也是抽象,super class没有制定具体的hook提供者,而subclass则可以指定具体的hook提供者是谁,然后可能做些特殊的处理。 ajoo很伟大!为大家翻译西域秘籍,向ajoo学习! |
|
| 返回顶楼 | |
|
最后更新时间: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 最大的用处是用来构造模型,而不是成品。我个人认为应该要有这种心态。否则可能会误解接口的本质。 我觉得接口体现多视角这种说法并不精当,更好的做法是把接口作为概念模型的工具。 |
|
| 返回顶楼 | |
|
最后更新时间:2004-09-27
引用 只是声名一个interface,而没有一个(哪怕是一个MOCK)对象来实现它,你是不可能真正开始使用你的类的
这话没错是没错(当然,还得看你怎么定义"使用"这个词.没有实现类,我也可以写我的接口的使用类) 但是,有什么意义呢? 没有main(),你的所有的类都不可能最终运行,那么难道我们说什么设计都要扯到main()吗? 人不吃饭都得饿死,难道我们讨论编程的时候能说oo的主要方面在于吃饭? “即声明即用”意义何在? 我上星期写了一个检测输入错误的模块. 我自己定义了接口StringMap来表示外界的输入(很可能从HttpServletRequest). 我完成了代码. 编译通过. 然后自己用HashMap来adapt出来一个StringMap来单元测试. 代码测试完成后. 交给别人, 别人只要把HttpServletRequest adapt成StringMap就成了. |
|
| 返回顶楼 | |
|
最后更新时间:2004-09-27
使用:能够被单元测试。
不要往main上扯,更不用谈到吃饭。 |
|
| 返回顶楼 | |
|
最后更新时间:2004-09-27
to:wuhaixing
你的例子,不是自底向上,而是需求的变更。当你有了一个class A。你就有了需要的功能,但是当你需要对这个class A有另外的看法时,你可以定义一个interface甚至多个interface,将它“贴”到这个class A上。 如果这样的需求没有出现,那么interface就是没有必要的。 |
|
| 返回顶楼 | |










