多重继承,在 Java 中使用接口与使用组合

Multiple Inheritance, using interface vs using composition in Java

基于一些 Whosebug post:

Java does not support multiple inheritance.

There are a few workarounds I can think of:

The first is composition: make a class that takes those two activities as fields.

The second is to use interfaces. // This is my question

我尝试通过接口或者组合构造一个可以有AAclass的方法和BBclass的方法的class。我读了很多关于继承与组合的文章,但我的问题是接口与组合(哪个更好)。如果我想在单个 class 首选项中使用这两个 classes 方法,

class AA{
  public int id(){
      return 0;
  }
}

class BB{
  public String name(){
      return "0";
  }
}

显然,Java不支持多重继承,我们需要使用接口或组合。

接口:

先构造这两个class对应的接口:

interface AAInterface{
  public int id();
}

interface BBInterface{
  public String name();
}

然后构造一个 Preference class 来实现这两个接口,并在 class 中声明两个 class 对象:

class Preference implements AAInterface, BBInterface{
  AA aa; 
  BB bb;

  public int id() {
      return aa.id();
  }

  public String name() {
      return bb.name();
  }
}

作文: 直接构造一个class,有两个字段对应两个class对象,以便使用它们的方法。

class Preference{
  AA aa; 
  BB bb;

public int id() {
    return aa.id();
  }

public String name() {
    return bb.name();
  }
}

因此,在 Preference class 中,通过使用其他接口或组合方法,我可以使用从 AA class 派生的 id() 方法和 name() 方法以及BB class.

问题:为什么我们要使用接口,因为组合更简单更好?我们有什么理由应该使用接口而不是组合?换句话说,如何使用 java 接口在单个 class 中获得两个 classes 方法,我的方法是正确的方法吗?

接口与继承行为无关。如果你想让其他人知道你的 class 的能力,而不是教你的 class 如何做事,请让你的 class 实现一个接口。

如果某个库可以对具有 getName() 方法的对象做一些有趣的事情,您不能指望它知道世界上所有具有此方法的 classes,但是您可以让你的 class 实现一个库知道的接口(比如 Named),它强制存在这个方法。

从您的角度来看,它不会对您的 class 做太多修改,并且您的对象可能仍然与其他 Named 对象有很大不同。从该库的角度来看,它使您的对象可用。

详细说明:如果您只需要访问其他class中已经存在的特定方法,这就足够了:

class Preference{
  AA aa; 
  BB bb;

public int id() {
    return aa.id();
  }

public String name() {
    return bb.name();
  }
}

您的对象将知道如何说出它的名称和 ID(或者会知道吗?毕竟它并不是您对象的真正名称:)。但是除其他事项外,您不能将它添加到 AA、BB、AAInterface 或 BBInterface 的集合中。它们都不是。它就像他们一样。根据需要,它可能足够也可能不够。