1

基于一些stackoverflow帖子:

Java 不支持多重继承。

我能想到一些解决方法:

第一个是组合:创建一个将这两个活动作为字段的类。

二是使用接口。// 这是我的问题

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

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

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

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

界面:

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

interface AAInterface{
  public int id();
}

interface BBInterface{
  public String name();
}

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

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

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

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

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

class Preference{
  AA aa; 
  BB bb;

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

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

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

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

4

1 回答 1

1

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

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

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

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

class Preference{
  AA aa; 
  BB bb;

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

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

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

于 2016-06-05T22:18:08.263 回答