继承自两个Java类

don*_*ton 2 java polymorphism inheritance multiple-inheritance superclass

我知道Java禁止从多个类继承并允许实现任意数量的接口.但是,虽然接口适用于多态,但它们不能包含其子类可能要共享的任何实际代码.如果我有两个不同的超类具有我想在子类中使用的共享代码,该怎么办?

示例:在我的程序中,有两个超类,一个使用HashMaps,另一个使用Strings,并且都有直接子类,一切都很好.但是现在我有第三个需要两个超类的共享功能,但它只能扩展一个.有没有一种简单的方法来重新设计这个类结构,而不必复制很多代码?

JB *_*zet 12

使用委托而不是继承:

public class Third implements FirstInterface, SecondInterface {
    private First first;
    private Second second;

    public void foo() {
        first.foo();
    }

    public String bar() {
        return second.bar();
    }
}
Run Code Online (Sandbox Code Playgroud)


Rya*_*oss 6

我已经看到了这一点

  1. 从两个超类中提取接口
  2. 创建一个实现接口的类,然后将所有调用委托给实际的对象

    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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

不会让您访问类heirarchy中受保护的成员.如果这就是你要找的东西,那你在Java中运气不好.但是,这将允许您使用多态方式将此对象称为IFirst和ISecond.因此,您将能够在需要两种类型之一的外部代码中访问它.

注意:我偷了JB的命名.