用于在A类中实现多个接口的不同主体

时间:2016-12-22 03:14:00

标签: java

最近我在采访中遇到过这个问题。 我们有两个接口

dff

所以我们需要以这样一种方式实现这一要求:接口dff %>% gather(opinion, values, -text) %>% ggplot(data = .) + geom_line(aes(x = text, y = values, group = opinion, color = opinion)) dff %>% gather(opinion, values, -text) %>% ggplot() + geom_bar(aes(y = values, x = text, fill = opinion), stat = "identity") 以打印interface I1{ void m1(); void m2(); void method(); } interface I2{ void m3(); void m4(); void method(); } class A implements I1,I2{ void m1(){} void m2(){} void m3(){} void m4(){} void method(){} } 和接口I1 method()来打印{执行时{1}}但是类"Test"可以实现其中只有一个I2。(ref) 我们是否有可能实现这一目标。

2 个答案:

答案 0 :(得分:1)

您可以为接口中的方法提供默认实现:

public interface I1 {
    default void method() {
        System.out.println("Test");
    }
}

public interface I2 {
    default void method() {
        System.out.println("Oops");
    }
}

实现这两个接口时,您可以使用以下语法选择要调用的默认实现

public class A implements I1, I2 {
    @Override
    public void method() {
        I1.super.method(); //or I2.super.method()
    }
}

如果您需要打印"测试哎呀"你也可以调用两个默认实现(并选择顺序)

public class A implements I1, I2 {
    @Override
    public void method() {
        I1.super.method();
        I2.super.method();
    }
}

修改

在Java 8之前,您可以实现类似的功能,但它更加冗长。 (请注意,我在这里使用某种decorator

public interface I1 {
    void m1();
    void m2();
    void method();
}

public interface I2 {
    void m3();
    void m4();
    void method();
}

public final class DefaultI1 implements I1 {
    @Override
    public void m1() {
        //TODO
    }

    @Override
    public void m2() {
        //TODO
    }

    @Override
    public void method() {
        System.out.println("Test");
    }
}

public final class DefaultI2 implements I2 {
    @Override
    public void m3() {
        //TODO
    }

    @Override
    public void m4() {
        //TODO
    }

    @Override
    public void method() {
        System.out.println("Test");
    }
}

public final class A implements I1, I2 {
    private final I1 i1;
    private final I2 i2;

    public A(I1 i1, I2 i2) {
        this.i1 = i1;
        this.i2 = i2;
    }

    @Override
    public void m1() {
        i1.m1();
    }

    @Override
    public void m2() {
        i1.m2();
    }

    @Override
    public void m3() {
        i2.m3();
    }

    @Override
    public void m4() {
        i2.m4();
    }

    @Override
    public void method() {
        i1.method();
        i2.method();
    }
}

用法

public static void main(String[] args) {
    A a = new A(new DefaultI1(), new DefaultI2());
    a.method(); //prints "Test Oops"
}

答案 1 :(得分:-2)

interface I1{
public void m();
}
interface I2{
public  void m();
}

public class Test{

public static void main(String[] args){
    I1 i1 = new I1(){
        public void m(){
            System.out.println("W");
        }
    };
    I2 i2 = new I2(){
        public void m(){
            System.out.println("M");
        }
    };
    i1.m();
    i2.m();
}


}