2010-10-19 13 views
1

J'ai un cas d'utilisation de ce typemise en œuvre Interface avec le corps vide

interface i { 
    void method1(); 
    void method2(); 
} 

class A implements i { 
    void method1() { 
    System.out.println("Method1 A .."); 
    } 

    void method2() { 
    System.out.println("Method2 A .."); 
    } 
} 


class B implements i { 

    void method1() { 
    System.out.println("Method1 B .."); 
    } 

    //Assume : B does not know how to implement method2 
    //void method2() { 

    //} 
} 

Je sais que la classe B peut être abstraite et non mettre en œuvre method2 pour l'interface i.

Est-ce que la pratique générale est que si je ne veux pas que ma classe B soit abstraite pour qu'elle lève une exception de la méthode 2 si elle n'a pas d'implémentation pour la méthode 2?

Répondre

4

Si vous ne mettez pas complètement en œuvre toutes les méthodes requises d'une interface, vous ne devriez pas implémenter cette interface. Il semble que ce que vous essayez réellement de faire est la suivante:

 

interface top 
{ 
    void method1(); 
} 

interface next extends top 
{ 
    void method2(); 
} 

class A implements next 
{ 
    public void method1() 
    { 
     ... something ... 
    } 

    public void method2() 
    { 
     ... something ... 
    } 
} 

class B implements top 
{ 
    public void method1() 
    { 
     ... something ... 
    } 
} 
 
2

Si vous n'allez pas implémenter une méthode à partir d'une interface, vous pouvez lancer une exception UnsupportedOperationException. Vraiment si cette situation devrait être évitée si possible, peut-être repenser le design.

+1

Vous voulez dire java.lang.UnsupportedOperationException? – DJClayworth

+0

@DJClayworth oui bien sûr, merci :) – Alb

1

Si B ne sait pas comment implémenter la méthode 2, alors votre interface est fausse. Vous auriez besoin d'une interface plus généralisée, sans méthode2, et peut-être une interface d'extension qui contient la méthode, mais qui n'est pas implémentée par B.

+0

Il peut y avoir le cas où vous ne possédez pas l'interface et n'avez aucun contrôle sur elle. – Alb

0

Il existe quelques précendents pour cela dans les bibliothèques Java standard. Certaines des plus remarquables sont la méthode "remove" de l'interface Iterator, qui lance UnsupportedOperationException. N'oubliez pas de documenter l'interface pour indiquer que cette exception est autorisée.