Java中多重继承的替代方案

Rak*_*yal 9 java multiple-inheritance

我创建了两个bean

class BackPageBean{
   String backPage = null;
  :
  :
  :
}


class InformationMessageBean{
   String informationMessage = null;
  :
  :
  :
}
Run Code Online (Sandbox Code Playgroud)

现在,如果一个类是反向识别的,那么它将扩展backPageBean,或者如果它需要显示某种消息,那么它会扩展InformationMessageBean.

class BackPageAware extends backPageBean{
}

class InfoMessAware extends InformationMessageBean{
}



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

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

   }
Run Code Online (Sandbox Code Playgroud)

现在问题是,如果我想要一个既是BackPageAware又是InformationAware的bean,因为我们没有多重继承,那么应该采用什么方法呢?

dfa*_*dfa 11

使用接口:

interface InfoMessAware {

     String getMessage();
}

interface BackPageAware {

     String getBackPage();
}

class MyBean implements InfoMessAware, BackPageAware {

     String getMessage() {
         return "message";
     }

     String getBackPage() {
         return "backPage";
     }
}
Run Code Online (Sandbox Code Playgroud)

然后用标准方法调用替换instanceof.


wil*_*ood 10

只是为了澄清我的评论.

就像Darth Eru说你创建了两个接口和两个默认实现.如果您有一个需要这两个行为的bean,那么该类实现了两个接口,但您也创建了默认实现的变量.这样你仍然不需要复制任何代码.

    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();
         }
    }
Run Code Online (Sandbox Code Playgroud)


Rob*_*bin 8

您描述的问题需要使用组合,而不是继承.该类是BackPageAware意味着它知道该类/功能.继承意味着它一个BackPage.您已经描述了HAS A关系.

正如已经说过很多次了,使用接口定义的合同用于检索对象的信息HAS.