2010-05-27 85 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個方法你只想實現一個是主要的代碼氣味,表明你應該重新考慮你的設計。但是,如果你的雙手綁在一起,你別無選擇,只能使用現有的界面,這個解決方案將起作用。