2015-08-03 2 views
6

Этот вопрос был задан мне в интервью. Я устал от гуглинга.Реализация одного интерфейса с использованием нескольких классов

У меня есть интерфейс со 100 методами. Я не хочу реализовывать все эти 100 методов в одном классе. Есть ли способ реализовать эти 100 методов, используя несколько классов и не повторяя реализацию?

Пример: В классе A используются первые 10 методов (только). Класс B реализует следующие 10 методов (только) и так далее.

Примечание: 1. Все классы, которые реализуют интерфейс, должны быть конкретными.

Насколько я знаю о java, это невозможно. Он упомянул об адаптере, когда он задал мне этот вопрос. Это заставило меня подумать, что есть способ сделать это.

Может ли кто-нибудь разъяснить мне об этом?

+1

ли Вы задаете версию Java? Coz после Java8 его possible.https: //docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html – Jabir

+0

Использовать композицию вместо наследования? (например, создать класс, который реализует интерфейс, но делегирует фактические методы вплоть до частичных реализаций). Это, похоже, соответствует требованиям. – GPI

ответ

1

Написать адаптер с пустой реализацией 100 методов

class Adapter{ 
    //write your empty implementations here as similar to KeyListener in Java 
    // They have written a keyAdapter and make use of key adapter. 

    } 

ie) class Adapter implements interface1{ 
    public void method1(){} 
    public void method2(){} 
    ..... 
} 

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

class A extedns Adapter{ 
    public void method1(){ 
} 
} 

т.е.)

+0

Он упомянул эту подсказку об адаптере. Поскольку я не использовал java 8. Я не мог его поймать. Можете ли вы сказать мне, как это сделать? – KarthickN

+0

Написание пустых методов не приведет к повторению реализации методов? – rahimv

+0

Я думаю, что это то, о чем он упомянул. Спасибо :) – KarthickN

2

Запишите все классы (A, B, C, D, E каждый реализовать 20 методов) ведьмой расширяющие друг друга без реализации интерфейса I:

    I 
        | 
A <- B <- C <- D <- E 

И только последний реализует интерфейс.

Упрощенные Exemple только с 2 способами:

public interface I { 

    void a(); 

    void b(); 

} 

public class A { 

    public void a() { 

    } 

} 

public class B extends A implements I { 

    public void b() { 

    } 

} 
+0

Кажется, это хорошая идея. Мне нравится. Но что, если интерфейс не находится под нашим контролем? – KarthickN

+0

Это не должно быть ... Просто реализуйте методы. Мой вышеприведенный пример является легко упрощенным. – dotvav

+2

Это ** НЕ ** надлежащее решение ООП. –

2

Если вы используете Java 8, вы можете определить реализации по умолчанию в интерфейсе для 100 методов, таких как:

public interface MyInterface{ 

    void methodA(); 

    int methodB(); 

    default boolean methodC(String name) { 
     return name.equals("Default"); 
    } 
} 

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

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

Опять же, это доступно только с Java 8.

1

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

+0

Это правильно в Java <= 7. Однако в Java> = 8 вам не нужно реализовывать все методы, если интерфейс предоставляет стандартные реализации. – singe3

+1

@ singe3 реализация по умолчанию, предоставляемая интерфейсом **, представляет собой конкретную реализацию, которая наследуется классом точно так же, как конкретная реализация из суперкласса будет –

+0

Вопрос состоял в том, чтобы не повторять 100 реализаций в каждом конкретном класс. Это решение отвечает на вопрос, потому что вы реализуете только 100 методов, а затем реализуете только те методы, которые вам нужны в конкретных классах. – singe3

1

Если методы интерфейса определены с реализацией по умолчанию;

public interface I { 

    default void a(){ 
    //implementation 
} 

     default void b(){ 
    //implementation 
} 

     default void c(){ 
    //implementation 
} 

    //97 more 

} 

public class A implements I{ 
    @override 
    public void a() { 

    } 

} 

public class B extends A { 
    @override 
    public void b() { 

    } 

public class C extends B { 
    @override 
    public void c() { 

    } 

} 

Даже без классов наследования могут быть независимы друг от друга, и они могут обеспечить реализацию для различных методов

+0

Это повторяет реализацию. – KarthickN

+1

оставить методы по умолчанию пустым, чтобы заставить один класс реализовать все, это всего лишь трюк – MstfAsan

+0

Этот метод в порядке. Спасибо :) – KarthickN

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