Java 接口方法的自定义实现

Java 接口方法的自定义实现,java,Java,在这个场景中我有一个疑问,我在这里发布了一些示例代码 public interface a{ public void m1(); public void m2(); public void m3(); . . . public void m100(); } public class A implements a{ public void m3(){

在这个场景中我有一个疑问,我在这里发布了一些示例代码

public interface a{

      public void m1();
      public void m2();
      public void m3();
         .
         .
         .
      public void m100();
}


public class A implements a{

       public void m3(){

           // implementation code     

           }

 // Here i need to implement only m3() method but not all 100 methods
 //basically i have to implement all the other 99 methods
 // but here i don't want to either implement or provide skeleton declarations for all 
 //remaining.... what should i do for compiling this ????


}

有人能帮忙吗?

我建议创建一个名为
AbstractA
的抽象类,它实现了接口
a
,但其所有方法的实现都为空。然后让每个实现类
扩展AbstractA


我还想知道,为什么您有一个包含所有这些方法的单一接口,而这些方法并不都是由实现接口的每个类实现的。这里几乎肯定有一个核心设计问题。

您可以编写元代码,编写一个程序来编写99个抛出NotImplementedException的方法


或者,您可以将“a”作为类而不是接口(可能是抽象的),并对其进行扩展,只实现您需要的功能。缺点是,如果您这样做,您的类就不能扩展任何其他类,因为Java不支持多重继承

解决此类问题的常见方法是创建实现接口的基类,并为所有方法提供存根实现

您可以在Swing中看到这一点,例如类或类是
操作
接口或
MouseListener
接口的琐碎实现,这些接口旨在使其更易于实现。为了在您的案例中实现这一点,您可以提供一个类
AbstractA

public abstract class AbstractA implmements a
{
    public void m1() {}
    public void m2() {}
    ///... and so on
}
然后创建实际的类

public class A extends AbstractA
{
    public void m3()
    {
        //your implmentation
    }
}

除非实现类A或A的某个超类中的所有100个方法,或者至少将它们作为抽象方法存根,否则A不会实现接口A

如果你真的想把每个方法的逻辑分离出来,这样你就不必在一个类中实现100个方法(这将是丑陋的),请考虑策略模式。 M是定义一种方法的接口:

public interface M {
    public void go();
}
M的每个实现实现M方法之一的逻辑:

public class M1 implements M {
    public void go() {
        //logic for m1
    }
}

public class M2 implements M {
    public void go() {
        //logic for m2
    }
}
等等

现在,类A引用了100 M对象,每个方法只需对其中一个对象调用go()。您可以分别实现和测试每种逻辑

public class A implement a {
    M[] ms = {
            new M1(),
            new M2(),
            new M3(),
            ... ,
            new M100()};

    private do(int index) {
        ms[index].go();
    }

    public m1 {
        do(0);
    }
    public m2 {
        do(1);
    }

    public m3 {
        do(2);
    }

   ... 

    public m100 {
        do(99);
    }
}
你可以使用代理

MyInterface instance = Proxy.newProxyInstance(MyInterface.class.getClassLoader(), MyInterface.class, new InvocationHandler(){
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
        if(!method.getName().equals("methodICareAbout")) {
           throw new UnsupportedOperationException();
        }

        //Implement your method here

     }
  });
免责声明:我永远不会建议在我的一个项目上实际使用这样的解决方案,但它确实允许您实现一个方法,而无需处理所有其他方法


IMO有一个包含100个方法的接口,您只想实现其中一个,这是一个主要的代码气味,表明您可能应该重新考虑您的设计。但是,如果你束手无策,你别无选择,只能使用现有的界面,这个解决方案就行了。

这正是MouseAdapter、WindowAdapter等为相应的MouseListener、WindowListener Swing界面所做的。@Renuka采访者想知道,如果您了解了不同的b/w接口和抽象类,以及如何将它们结合使用。@怀疑论者——仅仅因为他们在12-15年前就这样做了(Swing基本上继承了这种方法),并不意味着这是今天的良好设计实践。你也可以说,考虑到这两个野兽(UI事件的监听器)的本质,它们是证明规则的例外。