2010-05-27 80 views
1

我在这种情况下有一个疑问定制的实现,我已经张贴在这里的一些示例代码....的接口方法

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 ???? 


} 

谁能帮助呢?

回答

1

我会建议制作一个名为AbstractA的抽象类,它实现了接口A,但它的所有方法都有null实现。然后让每个实施类extend AbstractA

此外,我想知道为什么你有一个单一的接口与所有这些方法时,他们不是全部由每个实现接口类实现。你几乎肯定会遇到核心设计问题。

+1

这正是MouseAdapter,WindowAdapter等为Swing中相应的MouseListener,WindowListener接口所做的事情。 – Rhangaun 2010-05-27 18:17:09

+0

我在一次采访中遇到了这个问题...... – Renuka 2010-05-27 18:19:51

+0

@Renuka面试官想知道,如果你理解了界面和抽象类的区别,以及如何一起使用它们。 – zengr 2010-05-27 18:44:08

0

你可以元代码,编写一个程序来写出99个引发NotImplementedException的方法。或者,你可以使一个类而不是一个接口(或许是抽象的)并扩展它,只实现你需要的东西。缺点是你的类不能扩展任何其他类,因为Java不支持多继承。

0

这种类型的问题的常见方法是创建实现接口的基类,并为所有方法提供STUB实现。

你可以看到这个曾经在Swing例如AbstractAction类或​​类是微不足道的实施Action接口或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 
    } 
} 
0

除非你实现在A级或A的一些超全100层的方法,或至少将它们作为抽象方法存储,A不实现接口a。

如果你真的想把每个方法的逻辑分开,这样你就不必在一个类中实现100个方法(这将是丑陋的),请考虑策略模式。

M是定义一个方法的接口:

public interface M { 
    public void go(); 
} 

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); 
    } 
} 
1

您可以使用代理。

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 

    } 
    }); 

声明:我决不会建议实际使用这样的解决方案在我的项目之一,但它允许你实现一个方法,而不处理所有其他人。

国际海事组织有一个接口,其上只有100个方法你只想实现一个是主要的代码气味,表明你应该重新考虑你的设计。但是,如果你的双手绑在一起,你别无选择,只能使用现有的界面,这个解决方案将起作用。