11

我创建了两个豆子

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


class InformationMessageBean{
   String informationMessage = null;
  :
  :
  :
}

现在,如果一个类是 backpage 感知的,那么它将扩展 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() );
       }

   }

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

4

8 回答 8

12

使用接口:

interface InfoMessAware {

     String getMessage();
}

interface BackPageAware {

     String getBackPage();
}

class MyBean implements InfoMessAware, BackPageAware {

     String getMessage() {
         return "message";
     }

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

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

于 2009-06-24T13:27:37.830 回答
12

只是为了澄清我的评论。

就像 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();
         }
    }
于 2009-06-24T15:01:50.607 回答
8

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

正如现在已经多次说过的那样,使用接口来定义用于检索对象具有的信息的合同

于 2009-06-24T13:45:05.893 回答
2

正如在其他答案中所讨论的,可以使用接口和组合来模拟多重继承,但代价是必须编写大量样板代码。然而,周围有许多项目可以在编译时(通过预处理器)或在运行时自动执行此操作,例如jmixin

于 2009-11-21T13:42:28.583 回答
2

您的两个原始类应该是接口,每个类都有一个方法,用于检索实现应该返回的信息。

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;
  }
}

一般来说,您应该尽可能避免扩展非抽象类,这会导致各种问题。相反,在涉及具体类的情况下,尝试使用组合而不是继承,否则,尝试坚持使用接口和偶尔使用的抽象类。

于 2009-06-24T15:20:00.820 回答
1

You can have BackPageAware and InformationAware as interfaces rather than classes. This enables you to then fetch the messages from both interfaces in the case that the 'bean' you are referring to is of BackPageAware and InformationAware.

public class Name implements BackPageAware, InformationAware {}
于 2013-07-30T02:11:09.520 回答
0

将 BackPageAware 和 InformationAware 声明为接口,创建实现这些接口的抽象类以提供默认功能。任何只需要是两个接口之一的类都可以继承对应的抽象类。需要两者的类可以继承其中一个抽象类并实现另一个接口,或者实现两个接口,无论如何。如果没有默认功能,那么您甚至不需要抽象类。

于 2009-06-24T13:30:30.057 回答
0

您不能扩展多个类,但可以实现多个接口。请记住,当您将接口应用于类时,该类的对象与该接口具有 IS-A 关系。

于 2009-06-24T13:30:30.150 回答