Вопрос по java – Альтернатива множественного наследования в Java

8

Я создал две бобы

<code>class BackPageBean{
   String backPage = null;
  :
  :
  :
}


class InformationMessageBean{
   String informationMessage = null;
  :
  :
  :
}
</code>

Теперь, если класс осведомлен о backpage, он будет расширять backPageBean, или если ему нужно показать какое-то сообщение, он расширяет InformationMessageBean.

<code>class BackPageAware extends backPageBean{
}

class InfoMessAware extends InformationMessageBean{
}



    someFunction () {
       if ( theObject instanceOf backPageBean ) {
              prepareTheBackPage ( theObject.getBackPage() );
       }

       if ( theObject instanceOf InformationMessageBean ) {
              showtheInformation ( theObject.getMessage() );
       }

   }
</code>

Теперь проблема заключается в том, что если я хочу иметь bean-компонент, который является одновременно BackPageAware и InformationAware, тогда как у нас нет множественного наследования, каким должен быть подход?

Это Java. Не ЯВА. Rob
я никогда не знал это, спасибо Rakesh Juyal

Ваш Ответ

8   ответов
9

Просто чтобы уточнить мой комментарий.

Just like Darth Eru says you create the two interfaces and the two default implementations. When you have a bean that needs both of the behaviours you have that class implement the two interfaces but you also create variables of the default implementations. This way you still dont need to duplicate any code.

    interface InfoMessAware {

         String getMessage();
    }

    interface BackPageAware {

         String getBackPage();
    }

class DefaultInfoMessAware {
         String getMessage() {
             return "message";
         }
}

class DefaultBackPageAware {
         String getBackPage() {
             return "backPage";
         }
}

    class MyBean implements InfoMessAware, BackPageAware {
         private InfoMessAware messAware = new DefaultInfoMessAware();
         private BackPageAware backPageAware = new DefaultBackPageAware();

         String getMessage() {
             return messAware.getMessage();
         }

         String getBackPage() {
             return backPageAware.getBackPage();
         }
    }
Error: User Rate Limit ExceededDefaultInfoMessAwareError: User Rate Limit ExceededDefaultBackPageAwareError: User Rate Limit ExceededInfoMessAwareError: User Rate Limit ExceededBackPageAwareError: User Rate Limit Exceeded
1

Как обсуждалось в других ответах, множественное наследование может быть смоделировано с использованием интерфейсов и композиции за счет необходимости написания большого количества стандартного кода. Однако существует ряд проектов, которые могут автоматизировать это либо во время компиляции (через препроцессор), либо во время выполнения, напримерjmixin.

Error: User Rate Limit Exceededboilerplate c,odeError: User Rate Limit Exceeded
0

Вы не можете расширить несколько классов, но можете реализовать несколько интерфейсов. Помните, что когда вы применяете интерфейс к классу, объект класса имеет отношение IS-A к интерфейсу.

0

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Rakesh Juyal
1

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

public interface BackPageBean {
   public String getBackPage();
}


public interface InformationMessageBean {
   public String getInformationMessage();   
}

Если вы хотите, чтобы класс реализовывал как BackPageBean, так и InformationMessageBean, вы просто делаете это:

public MyBean implements BackPageBean, InformationMessageBean {

  public String getBackPage() {
    return null;
  }

  public String getInformationMessage() {
    return null;
  }
}

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

0

Вы можете иметьBackPageAware а такжеInformationAware как интерфейсы, а не классы. Это позволяет вам затем извлекать сообщения из обоих интерфейсов в случае, если «bean» вы имеете в видуBackPageAware а такжеInformationAware.

public class Name implements BackPageAware, InformationAware {}
11

использовать интерфейсы:

interface InfoMessAware {

     String getMessage();
}

interface BackPageAware {

     String getBackPage();
}

class MyBean implements InfoMessAware, BackPageAware {

     String getMessage() {
         return "message";
     }

     String getBackPage() {
         return "backPage";
     }
}

затем заменитьinstanceof со стандартными вызовами методов.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Rakesh Juyal
8

Проблема, которую вы описываете, требует использования композиции, а не наследования. Класс BackPageAware означает, что он знает об этом классе / функциональности. Наследование означает этоIS BackPage. Вы описалиHAS A отношения.

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

Похожие вопросы