/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
class Parent {
// those should be declared outside
static interface Foo {
void foo();
}
static interface Bar {
void bar();
}
protected String neededByFoo
= "foo"; protected String neededByBar
= "bar";
class FooA implements Foo {
public void foo() {
System.
out.
println(neededByFoo
+ "A"); }
}
class FooB implements Foo {
public void foo() {
System.
out.
println(neededByFoo
+ "B"); }
}
class BarA implements Bar {
public void bar() {
System.
out.
println(neededByBar
+ "A"); }
}
class BarB implements Bar {
public void bar() {
System.
out.
println(neededByBar
+ "B"); }
}
public static interface FooBar extends Foo, Bar {}
private static class FooBarDelegate implements FooBar {
Foo fooDelegate;
Bar barDelegate;
private FooBarDelegate(Foo f, Bar b) { fooDelegate = f; barDelegate = b; }
public void foo() { fooDelegate.foo(); }
public void bar() { barDelegate.bar(); }
}
public FooBar fooAbarA() {
return new FooBarDelegate(new FooA(), new BarA());
}
public FooBar fooBbarA() {
return new FooBarDelegate(new FooB(), new BarA());
}
public FooBar fooAbarB() {
return new FooBarDelegate(new FooA(), new BarB());
}
public FooBar fooBbarB() {
return new FooBarDelegate(new FooB(), new BarB());
}
public static void main
(String[] args
) { Parent p = new Parent();
foobar(p.fooAbarA());
foobar(p.fooAbarB());
foobar(p.fooBbarA());
foobar(p.fooBbarB());
}
private static void foobar(FooBar fb) {
fb.foo();
fb.bar();
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgoKY2xhc3MgUGFyZW50IHsKICAgIC8vIHRob3NlIHNob3VsZCBiZSBkZWNsYXJlZCBvdXRzaWRlCiAgICBzdGF0aWMgaW50ZXJmYWNlIEZvbyB7CiAgICAgICAgdm9pZCBmb28oKTsKICAgIH0KICAgIHN0YXRpYyBpbnRlcmZhY2UgQmFyIHsKICAgICAgICB2b2lkIGJhcigpOwogICAgfQoKICAgIHByb3RlY3RlZCBTdHJpbmcgbmVlZGVkQnlGb28gPSAiZm9vIjsKICAgIHByb3RlY3RlZCBTdHJpbmcgbmVlZGVkQnlCYXIgPSAiYmFyIjsKCiAgICBjbGFzcyBGb29BIGltcGxlbWVudHMgRm9vIHsKICAgICAgICBwdWJsaWMgdm9pZCBmb28oKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZWVkZWRCeUZvbyArICJBIik7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgRm9vQiBpbXBsZW1lbnRzIEZvbyB7CiAgICAgICAgcHVibGljIHZvaWQgZm9vKCkgewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmVlZGVkQnlGb28gKyAiQiIpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIEJhckEgaW1wbGVtZW50cyBCYXIgewogICAgICAgIHB1YmxpYyB2b2lkIGJhcigpIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5lZWRlZEJ5QmFyICsgIkEiKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBCYXJCIGltcGxlbWVudHMgQmFyIHsKICAgICAgICBwdWJsaWMgdm9pZCBiYXIoKSB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZWVkZWRCeUJhciArICJCIik7CiAgICAgICAgfQogICAgfQogICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRm9vQmFyIGV4dGVuZHMgRm9vLCBCYXIge30KICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZvb0JhckRlbGVnYXRlIGltcGxlbWVudHMgRm9vQmFyIHsKICAgICAgICBGb28gZm9vRGVsZWdhdGU7CiAgICAgICAgQmFyIGJhckRlbGVnYXRlOwogICAgICAgIHByaXZhdGUgRm9vQmFyRGVsZWdhdGUoRm9vIGYsIEJhciBiKSB7IGZvb0RlbGVnYXRlID0gZjsgYmFyRGVsZWdhdGUgPSBiOyB9CiAgICAgICAgcHVibGljIHZvaWQgZm9vKCkgeyBmb29EZWxlZ2F0ZS5mb28oKTsgfQogICAgICAgIHB1YmxpYyB2b2lkIGJhcigpIHsgYmFyRGVsZWdhdGUuYmFyKCk7IH0KICAgIH0KCiAgICBwdWJsaWMgRm9vQmFyIGZvb0FiYXJBKCkgewogICAgICAgIHJldHVybiBuZXcgRm9vQmFyRGVsZWdhdGUobmV3IEZvb0EoKSwgbmV3IEJhckEoKSk7CiAgICB9CiAgICBwdWJsaWMgRm9vQmFyIGZvb0JiYXJBKCkgewogICAgICAgIHJldHVybiBuZXcgRm9vQmFyRGVsZWdhdGUobmV3IEZvb0IoKSwgbmV3IEJhckEoKSk7CiAgICB9CiAgICBwdWJsaWMgRm9vQmFyIGZvb0FiYXJCKCkgewogICAgICAgIHJldHVybiBuZXcgRm9vQmFyRGVsZWdhdGUobmV3IEZvb0EoKSwgbmV3IEJhckIoKSk7CiAgICB9CiAgICBwdWJsaWMgRm9vQmFyIGZvb0JiYXJCKCkgewogICAgICAgIHJldHVybiBuZXcgRm9vQmFyRGVsZWdhdGUobmV3IEZvb0IoKSwgbmV3IEJhckIoKSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgCVBhcmVudCBwID0gbmV3IFBhcmVudCgpOwogICAgCWZvb2JhcihwLmZvb0FiYXJBKCkpOwogICAgCWZvb2JhcihwLmZvb0FiYXJCKCkpOwogICAgCWZvb2JhcihwLmZvb0JiYXJBKCkpOwogICAgCWZvb2JhcihwLmZvb0JiYXJCKCkpOwogICAgfQogICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb29iYXIoRm9vQmFyIGZiKSB7CiAgICAJZmIuZm9vKCk7CiAgICAJZmIuYmFyKCk7CiAgICB9Cn0=