/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
static void computeWithPrototype(Calculator proto) {
Calculator calc = proto.copy();
calc.setA(123);
calc.setB(321);
System.
out.
println(calc.
compute()); }
computeWithPrototype(new Adder());
computeWithPrototype(new Multiplier());
}
}
interface Calculator {
void setA(int a);
void setB(int b);
int compute();
Calculator copy();
}
class Adder implements Calculator {
private int a,b;
public void setA(int a) {this.a=a;}
public void setB(int b) {this.b=b;}
public int compute() {return a+b;}
public Calculator copy() {
Adder res = new Adder();
res.a = a;
res.b = b;
return res;
}
}
class Multiplier implements Calculator {
private int a,b;
public void setA(int a) {this.a=a;}
public void setB(int b) {this.b=b;}
public int compute() {return a*b;}
public Calculator copy() {
Multiplier res = new Multiplier();
res.a = a;
res.b = b;
return res;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKICAgICAgICBzdGF0aWMgdm9pZCBjb21wdXRlV2l0aFByb3RvdHlwZShDYWxjdWxhdG9yIHByb3RvKSB7CiAgICAgICAgICAgICBDYWxjdWxhdG9yIGNhbGMgPSBwcm90by5jb3B5KCk7CiAgICAgICAgICAgICBjYWxjLnNldEEoMTIzKTsKICAgICAgICAgICAgIGNhbGMuc2V0QigzMjEpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGNhbGMuY29tcHV0ZSgpKTsKICAgICAgICB9CiAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgIGNvbXB1dGVXaXRoUHJvdG90eXBlKG5ldyBBZGRlcigpKTsKICAgICAgICAgICAgY29tcHV0ZVdpdGhQcm90b3R5cGUobmV3IE11bHRpcGxpZXIoKSk7CiAgICAgICAgfQp9CgogICAgaW50ZXJmYWNlIENhbGN1bGF0b3IgewogICAgICAgIHZvaWQgc2V0QShpbnQgYSk7CiAgICAgICAgdm9pZCBzZXRCKGludCBiKTsKICAgICAgICBpbnQgY29tcHV0ZSgpOwogICAgICAgIENhbGN1bGF0b3IgY29weSgpOwogICAgfQogICAgY2xhc3MgQWRkZXIgaW1wbGVtZW50cyBDYWxjdWxhdG9yIHsKICAgICAgICBwcml2YXRlIGludCBhLGI7CiAgICAgICAgcHVibGljIHZvaWQgc2V0QShpbnQgYSkge3RoaXMuYT1hO30KICAgICAgICBwdWJsaWMgdm9pZCBzZXRCKGludCBiKSB7dGhpcy5iPWI7fQogICAgICAgIHB1YmxpYyBpbnQgY29tcHV0ZSgpIHtyZXR1cm4gYStiO30KICAgICAgICBwdWJsaWMgQ2FsY3VsYXRvciBjb3B5KCkgewogICAgICAgICAgICBBZGRlciByZXMgPSBuZXcgQWRkZXIoKTsKICAgICAgICAgICAgcmVzLmEgPSBhOwogICAgICAgICAgICByZXMuYiA9IGI7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgTXVsdGlwbGllciBpbXBsZW1lbnRzIENhbGN1bGF0b3IgewogICAgICAgIHByaXZhdGUgaW50IGEsYjsKICAgICAgICBwdWJsaWMgdm9pZCBzZXRBKGludCBhKSB7dGhpcy5hPWE7fQogICAgICAgIHB1YmxpYyB2b2lkIHNldEIoaW50IGIpIHt0aGlzLmI9Yjt9CiAgICAgICAgcHVibGljIGludCBjb21wdXRlKCkge3JldHVybiBhKmI7fQogICAgICAgIHB1YmxpYyBDYWxjdWxhdG9yIGNvcHkoKSB7CiAgICAgICAgICAgIE11bHRpcGxpZXIgcmVzID0gbmV3IE11bHRpcGxpZXIoKTsKICAgICAgICAgICAgcmVzLmEgPSBhOwogICAgICAgICAgICByZXMuYiA9IGI7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfQogICAgfQ==