如果这两的interface是实现一样的功能的话就写一个好了,如果有区别的话就要用类限定,同时实现两的函数了。

解决方案 »

  1.   

    to diaopeng,wes109:
    如何用类限定?能否给出示例代码?
      

  2.   

    曲线救国吧
    interface IA{
    public void test() ;
    }interface IB{
    public void test() ;
    }public class TestI implements IA, IB
    {
    public final static int A = 0 , B = 1 ; int InterfaceNo = A ;
    public static void main( String[] args){
    TestI t = new TestI() ;
    t.setI( A ) ;
    t.test() ;
    t.setI( B ) ;
    t.test() ;
    } public void setI( int InterfaceNo ){
    this.InterfaceNo = InterfaceNo ;
    } public void test(){
    switch( InterfaceNo ){
    case A :
    testA() ;
    break ;
    case B :
    testB() ;
    break ;
    }
    } private void testA(){
    System.out.println( "Here is in A") ;
    }
    private void testB(){
    System.out.println( "Here is in B") ;
    }
    }
      

  3.   

    既然是接口,就不应该管类具体实现啊,管它是某个方法是属于哪个接口的,你在需要使用的A接口,就可以说他是接口A的,用到B接口的时候,就是接口B的,没有任何影响啊。为什么要刻意去分开他们。
      

  4.   

    可以使用Adapter模式来解决这个问题。
      

  5.   

    同意兰雪!呆瓜才会让两个接口的函数名一样, 分明是难为自己嘛
    顺便问一下北极星, 偶是菜鸟哈, 甚么叫adapter模式 ?
      

  6.   

    但是,如果接口是由另外两家公司定义的(每家公司定义一个接口),而他们之间互不相识(不知道另一个接口中竟然有一个<仅仅一个,其他就不同了>相同的函数声明),而现在我所做的类要实现这两个接口,该怎么办?????
      

  7.   

    这是异想天开吗?我不这么认为!举个例子:Java中实现多线程需要实现一个Runable接口,这个接口就有一个Run()函数.
    如果有另外一个接口UserScript是实现用户脚本的功能,它也有一个Run()的函数(当然还有其他函数).那么,我要写一个支持多线程执行用户脚本的类,是否需要同时实现Runable和UserScript接口?试问一下,现在该怎么办?
      

  8.   

    用 interface_name.method_name 来使用:)我猜测的
      

  9.   

    C++是定义个别名来解决这个问题的,我想既然java是改自c++,应该也一样吧
    不过我没用过。
      

  10.   

    to satanmonkey:
    C++是怎样做的,能否给出示意代码?
    难道没有一个java高手会吗?
      

  11.   

    对不起,我不是一个C++程序员。只是看过一点C++,都是为了应付考试的。所以不能给你代码啦。
    你到C++版问一下,肯定答复很多啦
    呵呵
      

  12.   

    什么叫接口呀?
    java中的接口的定义就是在接口中声明的函数都是虚函数
    既然是虚函数了
    你显然要重新定义它嘛
      

  13.   

    //Filename: UserScript.java
    public interface UserScript {
        public void run();
    }//Filename: SomeUserScript.java
    public class SomeUserScript implements UserScript {
        public void run() {
            System.out.println("I'm SomeUserScript.");
        }
    }//Filename: UserScriptAdapter.java
    public class UserScriptAdapter {
        private UserScript fUserScript = null;    public UserScriptAdapter(UserScript us) {
            fUserScript = us;
        }    public void runScript() {
            System.out.println("I'm UserScriptAdapter.");
            fUserScript.run();
        }
    }//Filename: SomeClass.java
    public class SomeClass implements Runnable {
        private UserScriptAdapter fAdapter = null;    public SomeClass() {
            fAdapter = new UserScriptAdapter(new SomeUserScript());
        }
        public void run() {
        }    public void runScript() {
            fAdapter.runScript();
        }}SomeClass is what you want.
      

  14.   

    to i_am_biubiu:
    谢谢你详细的答复,但是我觉得还是不能满足我的要求。我需要的形式是:public class SomeUserScript implements UserScript,Runable{
    ........
      

  15.   

    同意 shingle(迅恒)同行采用的技术。实际上COM中就是采用类似的技术来解决这样的问题,不过有一点和shingle(迅恒) 不同的是COM中多了一个间接的层次。实际上这里的问题主要还是由于java不支持多重继承引起的,
    COM中解决就要比java中容易的多。同时shingle(迅恒)的解决方案不是很符合OOP的设计观念,而是典型的C语言设计风格的,用switch语句而不是多态性来实现的。
      

  16.   

    下面我给出C++中一般的解决方案:
    #include <iostream>
    using namespace std;class IA
    {
    public:
     virtual void  print()=0;
    };class IB
    {
    public:
     virtual void  print()=0;
    };class IAA:public IA
    {
    public:
    virtual void printA()=0;
    void print()
    {
    printA();
    }
    };class IBB:public IB
    {
    public:
    virtual void printB()=0;
    void print()
    {
    printB();
    }
    };class test:public IAA,public IBB
    {
    public:
    void printA()
    {
    cout<<"IA interface\n";
    } void printB()
    {
    cout<<"IB interface\n";
    }
    };int main()
    {
    IA *ia=new test();
    IB *ib=new test();
    ia->print();
    ib->print();
    return 0;
    }
      

  17.   

    为了很好的解决java这个十分的不足,我们不得不采用象COM那样的接口技术。
    我的意思的是加强封装,提供类似于QueryInterface()的接口处理技术。
      

  18.   

    为什么不行?从功能上说,已经满足了你的要求。难道你非要他的名字叫run不可?
      

  19.   

    同意supper_zzw的说法
    其实接口只是要求你有这样一个方法
    如果两个接口都有一个相同的方法
    那你只要实现一个就可以了
    否则使用类型上朔吧
      

  20.   

    同意supper_zzw的说法
    其实接口只是要求你有这样一个方法
    如果两个接口都有一个相同的方法
    那你只要实现一个就可以了
    否则使用类型上朔吧
      

  21.   

    to 上面参与讨论的哥们:
    由衷感谢各位给我这么多的提示!!!
    但是,不知道是不是我理解的不好,我觉得还是没有解决我的问题。我再次阐述我的问题:
    1.有两家公司A和B分别定义了两个接口IA和IB,两个接口功能上没有任何关系,只不过在互相不知道的情况下有一个函数定义完全相同(假设为 void Run())
    2.我所在的公司C决定开发一个类CC,同时实现IA和IB,但是这个类是由另两家公司D和E使用(或许有更多),公司D只知道类CC能够实现IA接口,公司E只知道类CC能够实现IB接口。
    3。现在需要把类CC封装成外部使用时只需要按照下面的形式即可:
    公司D使用时:
    //in MyApp.java
    public class MyApp{
      public static void main(String[] args){
        IA a=new CC();  
        CD d=new CD();
        d.DoSomethingWithIA(a);
      }
    }//in CD.java    
    public class CD{
      public void DoSomethingWithIA(IA inputA){
        inputA.Run();
        ..........
        ..........
      }
    }公司E使用形式与公司D相类似,总言之,就是他们不需知道类CC原来已经同时实现两个接口,为了使用其中一个接口,还要额外设置一个标志。以上就是我的问题的完整叙述,请各位哥们继续讨论。
      

  22.   

    我觉得iwin的问题说法不对
    1.封装的概念部清楚。
      对类CC而言,提供的服务是一个还是两个
      调用CC的类,只关心cc提供的服务,而不必关心内部的实现。
    2.如果是提供两种不同的服务,重载或用不同的method name
    3.如果是提供一种不同的服务,不用说了
      

  23.   

    to liu_ying_99:
    1.对类CC而言,可以同时提供两个服务
      对调用CC的类,没错,我就是要他们不必关系内部的实现,所以才觉得shingle给出的“曲线救国”的方法不能满足要求,我的要求请见上面的第三点2.我不能用不同的method name,因为接口定义不是我设计的。我只是负责接口的实现。
      

  24.   

    偶要说明的是:
    偶上次所说的那个标志的设定并不是以参数的形式直接放在你所要实现的接口中, 而是另外写一个专门设置的函数,你所要做的是每次调用正确的接口方法实现前先调用设置标志的函数,这样, 虽然多了一个函数, 但是能达到你的目的.不过这样的话, 如果你实现的接口是别人用到的话, 别人就得遵守你的这个事先调用set标志的函数的默认约定
      

  25.   

    我理解iwin()的意思,但我觉得iwin()的努力似乎有点违背逻辑。
        两个接口IA和IB定义了要求内涵不同的函数run()要同一个类CC实现,那么在这两个接口声明的时候,无论如何须通过某种途径通知CC说,你的run()必须要跑“我”要求的内涵,否则CC根本就无从识别,即使用C++也需如此。如果IA和IB在声明的时候可以有个信息传递给CC,比如IA ia=new CC("IA"),那就好办,就可以用 shingle(迅恒) 的方法,否则你总得有个途径通知CC啊。既然IA和IB是改不了了,就必须在CC上设计一个接收和区分IA或IB的方法。
      

  26.   

    请问iwin,你知道什么人(类)调用你的run方法是用接口A中声明的方法,什么人(类)调用你的方法时是用接口B中声明的方法吗?
    如果知道,有办法
      

  27.   

    另外说一句,你可以用Factory方法,把你的构造函数保护起来,不让他直接new你的类,这样你可以用不同的类去实现这两个不同的接口
    比如IA a = Factory.getInterfaceIA(some param);
    IB b = Factory.getInterfaceIB(some param);or CC c = new CC();
    a = Factory.getInstanceIA(cc);
    ...替代 IA a = new CC();
         IB b = new CC();
      

  28.   

    to  kkhui(jacky) :
    如果知道调用者,该怎么办?
      

  29.   

    从stack中找调用者的名字,分别处理了,呵呵。
      

  30.   

    我的做法:
    --------------------------
    class UserScriptImplement implements UserScript {
        public void run(){ run something... }
    }
    class RunableImplement implements Runable {
        public void run(){ run something... }
    }
    public class SomeUserScript {
        public void run(Object o) {
            if (o instanceof UserScriptImplement || o instanceof RunableImplement)
                o.run();
            else
                return;
        }
    }
    --------------------------
    我觉得应该用类的合成,而不必强行。
      

  31.   

    我想iwin在这儿的意思就是需要用一个类实现两个公司不同的功能接口,而在两个公司来调用这个类的时候,其实是透明的,并不知道内部的函数实现,是两个相互独立的实体。这样的话,肯定需要做这种开关设置,根据不同的开关去触发不同的实现过程,是不是这样的呢?
       这个跟接口应该没有多少实质的关系了,要不就用Factory方法,用不同类来实现不同的接口;要不直接在这个方法中作判断,根据传进来的开关变量实现不同的功能。
      

  32.   

    用一个包装类包装一个接口,
    同意 i_am_biubiu(Biubiu) 方案!~
      

  33.   

    i_am_biubiu()是标准的java风格的解决办法,iwin()如果你还没有弄明白的话,就要好好领悟。
    zosatapo()的方法符合oo的基本原理,不过可能是由于“四人帮(GoF)”的影响使java地解决方案更偏向i_am_biubiu()的风格。(当然相对而言也更为灵活一些)
    kkhui()到是一种别开生面的做法,在特定的环境(经验比较少,还想不起来那里会用到。也许接口种类比较固定,而需要工厂除了创建外还必须负责其他职能的时候?不过你的需求也很特别)下可能也是一种好的解决办法。
      

  34.   

    实际上这个问题焦点就是:  如何用一个类实现不同接口的同名函数,通过不同接口调用这个类的这个同名方法时要实现不同的功能!如果要应java的接口本意,那就实现2个不同的类来得到不同的功能!那java接口的本意呢?  实际上这就是C++进行多继承是遇到的同样的问题!(C++是通过虚拟继承来解决的),而java为何不提倡多继承而用接口来代替多继承,很大程度上是为了解决同名方法的歧义问题(也是为了考虑速度)!接口是怎么解决这个歧异问题的呢--只做声明!所以同一个类实现的这个同名方法必然只有一种功能!如果需要其他功能必须再实现一个类。也就是只能找C公司再做一个类了,或者由D公司自己做!其实这也就和上面兄弟说的不远了!
      

  35.   

    你必须绕开这个问题
    接口应该是你定义的,由你主导
    当两个公司的不同品牌不同尺寸的鞋拿给你穿时,你会怎么办?修改自己的脚以让它能同时适应两双鞋?
    外部要求的接口,需求不同而方法产生歧义时,你就不应该同时实现两者了
    你应该采取一种桥接的方式,使用不同的Adapter,大不了再在Adapter上做一层接口,以满足各自的要求--当然,这是一种欺骗:)
      

  36.   

    if one impl of the method can work for both interface, then there's no problem.
    Otherwise, you could use nested class.Class A
    {
      private Class AA implements IA{public void test(){...};}
      private Class AB implements IB{public void test(){...};}
    }Actually, as long as the interfaces are well defined. You can choose whatever the easiest way to implement them.