2013-06-06 2 views
0

У меня есть интерфейс A, который определил 3 метода, которые должны реализовывать, и класс B должен реализовывать все три метода. Нет проблем. Но в классе C также я реализую интерфейс A, поэтому мне нужно написать реализацию для всех трех методов. Но мой класс C не хочет doSomthing3().При реализации интерфейса он наследует нежелательные методы

Я просто приводил здесь пример, но мое реальное приложение является большим с множеством методов.

Предположим, у меня есть 100 подклассов, реализующих интерфейс A, и теперь я хочу, чтобы 50 классов имели еще один новый метод, который я могу добавить в интерфейс A. Но тогда я должен реализовать его во всех 100 под классах? Почему я не наследую нежелательный метод.

public interface A { 

    public void doSomething1(); 
    public void doSomething2(); 
    public void doSomething3(); 

} 

public class B implements A{ 
    public void doSomething1(){ 
     System.out.println("doSomething 1"); 
    } 

    public void doSomething2(){ 
     System.out.println("doSomething 2"); 
    } 

    public void doSomething3(){ 
     System.out.println("doSomething 3"); 
    } 

} 

public class C implements A{ 

    public void doSomething1(){ 
     System.out.println("doSomething 1"); 
    } 

    public void doSomething2(){ 
     System.out.println("doSomething 2"); 
    } 

    public void doSomething3(){ /*Do nothing in this class */ } 

} 
+2

Вы не * наследуете * интерфейс, вы просто следуете * контракту реализации *. – NINCOMPOOP

ответ

4

Вы можете создать два интерфейса. Один из них будет содержать методы, которые будут выполняться в обоих классах, а другой - дополнительный метод, который вы хотите использовать для другого класса. Затем просто примените правый интерфейс к нужному классу.

public interface A { 

    public void doSomething1(); 
    public void doSomething2(); 

} 

public interface B extends A { 

    public void doSomething3(); 

} 

Тогда

public class ClassB implements B{ 
    public void doSomething1(){ 
     System.out.println("doSomething 1"); 
    } 

    public void doSomething2(){ 
     System.out.println("doSomething 2"); 
    } 

    public void doSomething3(){ 
     System.out.println("doSomething 3"); 
    } 

} 


public class ClassA implements A{ 

     public void doSomething1(){ 
      System.out.println("doSomething 1"); 
     } 

     public void doSomething2(){ 
      System.out.println("doSomething 2"); 
     } 

    } 
0

Вы можете создать простую реализацию своего интерфейса, который всегда вызвать NoSuchMethodError или любое другое исключение во время выполнения.

И затем просто расширяет этот класс и отменяет только полезные методы.

Или, как указано в другом ответе, вы можете подумать о перепроектировании своих интерфейсов.

2

Эта проблема решается путем введения таких Adapter: это абстрактный класс, который реализует все методы из унаследованного интерфейса. В вашем желаемом классе можно переопределить только то, что методы, которые вы хотите:

public abstract class AAdapter implements A(){ 
    public void doSomething1(){ 
    } 

    public void doSomething2(){ 
    } 

    public void doSomething3(){ 
    } 
} 

и в своем классе:

public class C extends AAdapter(){ 

    @Override 
    public void doSomething1(){ 
     system.out.println("doSomething 1"); 
    } 

    @Override 
    public void doSomething2(){ 
     system.out.println("doSomething 2"); 
    } 
} 
0

Вы можете рассмотреть вопрос о создании реализации заглушки:

public class SimpleA implements A { 

    @Override 
    public void doSomething1() { 
    throw new UnsupportedOperationException(); 
    } 

    // rest omitted 

} 

Теперь ваш классы могут распространять SimpleA и переопределять только необходимые методы.

Смежные вопросы