我知道Java禁止从多个类继承并允许实现任意数量的接口。但是,虽然接口适用于多态,但它们不能包含其子类可能要共享的任何实际代码。如果我有两个不同的超类具有我想在子类中使用的共享代码,该怎么办?
示例:在我的程序中,有两个超类,一个使用HashMaps,另一个使用Strings,并且都有直接子类,一切都很好。但是现在我有第三个需要两个超类的共享功能,但它只能扩展一个。有没有一种简单的方法可以重新设计这个类结构,而无需复制大量代码?
答案 0 :(得分:12)
使用委托而不是继承:
public class Third implements FirstInterface, SecondInterface {
private First first;
private Second second;
public void foo() {
first.foo();
}
public String bar() {
return second.bar();
}
}
答案 1 :(得分:6)
我已经通过
看到了这一点创建一个实现接口的类,然后将所有调用委托给实际的对象
public interface IFirst { public void foo(); }
public interface ISecond { public void bar(); }
public class Third implements IFirst, ISecond {
private IFirst first;
private ISecond second;
public Third(IFirst first, ISecond second) {
this.first = first;
this.second = second;
}
@Override
public void foo() {
first.foo();
}
@Override
public String bar() {
return second.bar();
}
}
此不会授予您访问类heirarchy中受保护成员的权限。如果这就是你要找的东西,那你在Java中运气不好。但是,这将允许您使用多态方式将此对象称为IFirst和ISecond。因此,您将能够在需要两种类型之一的外部代码中访问它。
注意:我偷了JB的命名。
答案 2 :(得分:2)
使用组合 - 基本上让你的新类扩展其中一个类,并在新类中有一个类型为超类2的成员变量。或者你可以在新类中使用组合并在新类上使用组合class1和class2在其中键入成员
答案 3 :(得分:1)
我质疑在管理哈希映射的类与管理字符串的类之间存在多少相互依赖性的任何设计。但是要直接回答你的问题,你可以让你的第三个类成为Facade包装你的超类的实例,然后让它的方法适当地委托给那些类。
答案 4 :(得分:1)
解决这个问题的一个方法是支持组合而不是继承。如果您可以设计当前要扩展的两个类,以便它们可以用作新类的成员,那么您应该具有所需的灵活性。而不是
class MyClass extends MapBehavior, StringBehavior { ... }
试
class MyClass {
MapBehavior mb;
StringBehavior sb;
...
}