多重继承,在 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 的集合中。它们都不是。它就像他们一样。根据需要,它可能足够也可能不够。
基于一些 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 的集合中。它们都不是。它就像他们一样。根据需要,它可能足够也可能不够。