2016-08-07 5 views
4

Для проекта, я следующие классы:Как избежать множественного наследования?

  • SuperClass
  • Подкласс 1
  • Подкласс 2

Два подклассы расширяют суперкласс. Теперь мне нужен третий класс с поведением EXACT (чтение, такие же реализация переопределенных методов) как SubClass 1, так и Subclass 2. Поскольку Subclass 1 переопределяет только 1 метод в SuperClass, а Subclass 2 не переопределяет этот метод, I хотите, чтобы третий класс наследовал Суперкласс и просто реализовал его с помощью методов подкласса 1 и подкласса 2. Теперь это хороший OO-дизайн? Я не вижу другого решения, потому что множественное наследование в Java просто невозможно. Есть ли альтернативы?

+4

Фавор состав над наследованием ... – vlaz

+3

Было бы полезно, чтобы увидеть определение классов и как вы будете использовать их, чтобы сказать, является ли это хороший дизайн –

ответ

8

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

Вы видите, наследование не о коде повторное использование. Речь идет о создании полезных абстракций; и хорошо использовать полиморфизм, например.

В вашем случае: возможно, эти функции могут/должны быть помещены в более мелкие интерфейсы; а затем разделились на свои, независимые классы. И затем вы используете состав объектов вместо наследования, чтобы построить нужную вещь.

3

Ниже приведен пример использования стандартных методов Java 8, описанных в @GhostCat. Я не вижу ничего плохого в этом проекте OO как таковом. Независимо от того, подходит ли вам ваш случай использования, зависит от деталей проблемы, которую вы решаете.

public class Main { 

    public static void main(String... args) { 
     SuperClass sc = new SubClass3(); 
     sc.foo(); // overridden foo 
     sc.bar(); // overridden bar 
    } 

    interface SuperClass { 
     default void foo() { 
      System.out.println("default foo"); 
     } 
     default void bar() { 
      System.out.println("default bar"); 
     } 
    } 

    interface SubClass1 extends SuperClass { 
     @Override 
     default void foo() { 
      System.out.println("overridden foo"); 
     } 
    } 

    interface SubClass2 extends SuperClass { 
     @Override 
     default void bar() { 
      System.out.println("overridden bar"); 
     } 
    } 

    static class SubClass3 implements SubClass1, SubClass2 {} 
} 
Смежные вопросы