免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: TAxxjszxlkjf
打印 上一主题 下一主题

关于java中接口的认识(不知理解的是否正确) [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-09-07 15:43 |只看该作者

关于java中接口的认识(不知理解的是否正确)

楼上的朋友
callback a=new A() 和 A a=new A()
那么这样的方式(使用接口)是不是就降低了耦合呢

论坛徽章:
0
12 [报告]
发表于 2005-09-07 16:22 |只看该作者

关于java中接口的认识(不知理解的是否正确)

如果class A是interface callback的一个实现的话,对于调用者来说A就是透明的,所以不应该有new A()这种操作存在
至于调用者怎么获得interface的实现,可以参考我前面回帖中说的方法

论坛徽章:
0
13 [报告]
发表于 2005-09-07 16:35 |只看该作者

关于java中接口的认识(不知理解的是否正确)

楼主的代码上还是没有降低耦合度。
我举个别的例子吧:

  1. import java.util.Iterator;
  2. import java.util.Vector;

  3. //Interface Decouble Example

  4. public class  ChinaUnixJavaCircusShow{

  5.         public static void main(String[] args) {
  6.                 Circus c = new Circus();
  7.                 c.addAnimalActors(new Bear());
  8.                 c.addAnimalActors(new Horse());
  9.                 c.addAnimalActors(new Dog());
  10.                 c.bigShow();
  11.         }
  12. }

  13. interface AnimalActor {
  14.         public void showBestPose();
  15. }

  16. class Bear implements AnimalActor {

  17.         public void showBestPose() {
  18.                 System.out.println("This bear show!!");
  19.         }
  20. }

  21. class Horse implements AnimalActor {

  22.         public void showBestPose() {
  23.                 System.out.println("This horse show!!");
  24.         }
  25. }

  26. class Dog implements AnimalActor {

  27.         public void showBestPose() {
  28.                 System.out.println("This dog show!!");
  29.         }
  30. }

  31. class Circus {
  32.         private Vector actors = new Vector();

  33.         public void addAnimalActors(AnimalActor a) {
  34.                 actors.add(a);
  35.         }

  36.         public void bigShow() {
  37.                 Iterator i = actors.iterator();
  38.                 while (i.hasNext()) {
  39.                         ((AnimalActor) i.next()).showBestPose();
  40.                 }
  41.         }
  42. }
复制代码

由于使用了接口,Circus不再理会参加演出的具体的动物演员的类,只要是实现了AnimalActor接口的类都可以参加Big Show。
如果没有使用接口,那么Circus的代码中就要包含Horse,bear, dog类的引用。现在Circus的代码和具体可能有多少种动物无关,这就是解藕

论坛徽章:
0
14 [报告]
发表于 2005-09-07 21:45 |只看该作者

关于java中接口的认识(不知理解的是否正确)

版主说得没错,例子很形象

我原本也想回这个贴,但一时没有找到好的例子。

论坛徽章:
0
15 [报告]
发表于 2005-09-08 08:30 |只看该作者

关于java中接口的认识(不知理解的是否正确)

这种例子我也是知道的
类F
package com.examples.basics;
interface wuqi{
    public void gongji();
}
class A implements wuqi {
public void gongji() {
System.out.println("Inside A's constructor.";
}
}
class B implements wuqi {
public void gongji() {
System.out.println("Inside B's constructor.";
}
}


class C implements wuqi {

public void gongji() {
System.out.println("Inside C's constructor.";
}
}

class F  {
public static void main(String args[]){
wuqi a = new A();
a.gongji();
wuqi b = new B();
b.gongji();
wuqi c = new C();
c.gongji();
}
}


类Epackage com.examples.basics;
class A  {
public void gongji() {
System.out.println("Inside A's constructor.";
}
}
class B  {
public void gongji() {
System.out.println("Inside B's constructor.";
}
}

class C {
public void gongji() {
System.out.println("Inside C's constructor.";
}
}
class E  {
public static void main(String args[]){
A a = new A();
a.gongji();
B b = new B();
b.gongji();
C c = new C();
c.gongji();
}
}


类D
package com.examples.basics;
interface wuqi{
    public void gongji();
}
class A implements wuqi {
public void gongji() {
System.out.println("Inside A's constructor.";
}
}
class B implements wuqi {
public void gongji() {
System.out.println("Inside B's constructor.";
}
}


class C implements wuqi {

public void gongji() {
System.out.println("Inside C's constructor.";
}
}
class wqkzt {

public void kaihuo(wuqi w) {
   w.gongji();
}
}
class D  {
public static void main(String args[]){
wqkzt e=new wqkzt();
e.kaihuo(new A());
e.kaihuo(new B());
e.kaihuo(new C());
}
}


其中类D的实现应该和版主的例子是一样的,我只是想知道类D中e.kaihuo(new C())传递参数传递的是对象还是方法。如果是对象的话,那么不就和类E F不就一样了吗。即类D中若多一项e.kaihuo(new D());
那类E
D d = new D();
d.gongji();
类 F
wuqi d = new C();
d.gongji();
(其中类D也实现gongji()
3个类比起来从哪里可以看出解耦呢

论坛徽章:
0
16 [报告]
发表于 2005-09-08 08:49 |只看该作者

关于java中接口的认识(不知理解的是否正确)

传递的当然是对象。

wqkzt类不再关心具体武器的类型。只是对wuqi这个接口进行操作,这就是解耦

论坛徽章:
0
17 [报告]
发表于 2005-09-08 09:10 |只看该作者

关于java中接口的认识(不知理解的是否正确)

不过楼主的例子还真是弓虽
用拼音做类名……-_-||

论坛徽章:
0
18 [报告]
发表于 2005-09-08 19:02 |只看该作者

关于java中接口的认识(不知理解的是否正确)

e.kaihuo(new A());
e.kaihuo(new B());
e.kaihuo(new C());
wqkzt类这样不也得关心武器的类型吗
(真郁闷就是不明白。)

论坛徽章:
0
19 [报告]
发表于 2005-09-09 00:28 |只看该作者

关于java中接口的认识(不知理解的是否正确)

>;  wqkzt类这样不也得关心武器的类型吗

在 wqkzt 这个类的定义中不用(也不可能)关心武器的类型。

论坛徽章:
0
20 [报告]
发表于 2005-09-09 08:40 |只看该作者

关于java中接口的认识(不知理解的是否正确)

原帖由 "TAxxjszxlkjf" 发表:
e.kaihuo(new A());
e.kaihuo(new B());
e.kaihuo(new C());
wqkzt类这样不也得关心武器的类型吗
(真郁闷就是不明白。)
你是所有类的程序员,所以你看到了所有的细节。假设你只开发了wqkzt类,其他类你没有source code,你看到了什么?能看到具体的武器类型么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP