2013-09-03 4 views
4

Имея только небольшое количество времени для поиска таких вещей, я не мог видеть ничего, что охватывало мой конкретный сценарий.Частичная реализация интерфейса

Я работаю с сторонним интерфейсом. Скажем, на данный момент это выглядит следующим образом:

public interface interface1 
    { 
     public String getVar1(); 

     public void method1(); 

     public void method2(); 

    } 

Мне нужно создать несколько классов, которые используют этот интерфейс, но фактической реализации метода «method2» будет отличаться на каждом, где, как «method1 "и" getVar1 "всегда будет одним и тем же кодом.

Есть ли способ создать абстрактный базовый класс, который реализует интерфейс, но только заставляет реализацию «method2» на дочерние классы?

Я попытался

public abstract @Override void method2 

, но в то время как это «приемлемым» во время разработки в Netbeans (не знаю, если затмение действует по-разному) во время компиляции он жалуется, что method2 должна быть реализована.

Если это невозможно, справедливо, мне просто нужно проверить.

благодарит

+4

Вы должны объявить Ваш класс * * абстрактен и оставить любую реализацию 'method2' –

ответ

14

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

public abstract class AbstractInterface implements interface1 { 
    @Override 
    public String getVar1() { 

    } 

    @Override 
    public void method1() { 

    } 
} 
public class Implementation extends AbstractInterface { 
    @Override 
    public void method2() { 

    } 
} 

См: Java tutorial on abstract classes.

+0

Отлично, спасибо. –

0

У вас может быть abstract Class, который обеспечивает реализацию для «метода 1» и «getVar1», но decalre method2 as abstract в этом классе.

Теперь наследуйте этот абстрактный суперкласс во всех ваших классах!

Как

public interface interface1 { 

    public void getVar1(); 

    public void method1(); 

    public void method2(); 

} 

public abstract class test implements interface1 { 

    @Override 
    public void getVar1() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void method1() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public abstract void method2(); 


} 

public class test1 extends test { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void method2() { 
     // TODO Auto-generated method stub 

    } 

} 
2

Вы можете создать абстрактный класс, который не реализует method2()

public abstract class AbstractImplementation implements interface1 { 
    public String getVar1() { 
     // implementation .. 
    } 

    public void method1() { 
     // implementation .. 
    } 

    // skip method2 
} 

Затем создайте несколько реализаций:

public class Implementation1 extends AbstractImplementation { 
    public void method2() { 
     // implementation 1 
    } 
} 

public class Implementation2 extends AbstractImplementation { 
    public void method2() { 
     // implementation 2 
    } 
} 

... 
+0

Он говорит о стороннем интерфейсе. Если код в программе thirdparty недействителен (тест интерфейса1) { test.getVar1(); // не удалось вызвать эту услугу } –

+0

Упс, я забыл добавить 'implements interface1'. Исправлено это. Спасибо за информацию – micha

0

В этом случае у вас есть 3 абстрактные методы в интерфейсе вы можете переопределить один или два метода г другие методы будут оставаться абстрактными

abstact class PartialImplementationDemo implements interface1 { 
    @Override 
    public void method1() { 
    // override method1() here 
    } 

    // leave other methods as abstract 
    abstract public void method2(); 
    abstract public String getVar1(); 
} 
Смежные вопросы