/* 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
{
{
GenericObject o;
o = new Object1(10, 10);
o.wh();
System.
out.
println(o.
w); // Output: 3 (ok) System.
out.
println(o.
h); // Output: 10 (ok)
o = new Object2(10, 10);
o.wh();
System.
out.
println(o.
w); // Output: 7 (ok) System.
out.
println(o.
h); // Output: 4 (ok)
// o = new Object + inputFromUser + (10, 10);
/*I know that is an absurd, just to illustrate...
if polymorphism can solve this problem, I thik it's the best option. So how use it here?
I don't wanna use ifs or switchs, I will use more than 300 classes*/
Class<?> typeFromUser = Class.forName("Object" + inputFromUser);
java.
lang.
reflect.
Constructor<?> constructor
= typeFromUser.
getDeclaredConstructor(Integer.
TYPE,
Integer.
TYPE); Object obj
= constructor.
newInstance(10,
10); o = (GenericObject) obj;
o.wh();
System.
out.
println(o.
w); // Output: 3 (that's what I wanna obtain) System.
out.
println(o.
h); // Output: 10 (that's what I wanna obtain) }
}
abstract class GenericObject {
int w, h, x, y;
GenericObject (int x, int y) {
this.x = x;
this.y = y;
}
public abstract void wh();
}
class Object1 extends GenericObject{
Object1 (int x, int y) {
super(x, y);
}
@Override
public void wh () {
w = 3;
h = 10;
}
}
class Object2 extends GenericObject{
Object2 (int x, int y) {
super(x, y);
}
@Override
public void wh () {
w = 7;
h = 4;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCUdlbmVyaWNPYmplY3QgbzsKCiAgICAgICAgbyA9IG5ldyBPYmplY3QxKDEwLCAxMCk7CiAgICAgICAgby53aCgpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihvLncpOyAvLyBPdXRwdXQ6IDMgKG9rKQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihvLmgpOyAvLyBPdXRwdXQ6IDEwIChvaykKCiAgICAgICAgbyA9IG5ldyBPYmplY3QyKDEwLCAxMCk7CiAgICAgICAgby53aCgpOwogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihvLncpOyAvLyBPdXRwdXQ6IDcgKG9rKQogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihvLmgpOyAvLyBPdXRwdXQ6IDQgKG9rKQoKICAgICAgICBTdHJpbmcgaW5wdXRGcm9tVXNlciA9ICIxIjsKICAgICAgICAKICAgICAgICAvLyBvID0gbmV3IE9iamVjdCArIGlucHV0RnJvbVVzZXIgKyAoMTAsIDEwKTsKICAgICAgICAvKkkga25vdyB0aGF0IGlzIGFuIGFic3VyZCwganVzdCB0byBpbGx1c3RyYXRlLi4uCgkJaWYgcG9seW1vcnBoaXNtIGNhbiBzb2x2ZSB0aGlzIHByb2JsZW0sIEkgdGhpayBpdCdzIHRoZSBiZXN0IG9wdGlvbi4gU28gaG93IHVzZSBpdCBoZXJlPwoJCUkgZG9uJ3Qgd2FubmEgdXNlIGlmcyBvciBzd2l0Y2hzLCBJIHdpbGwgdXNlIG1vcmUgdGhhbiAzMDAgY2xhc3NlcyovCgkJCgkJQ2xhc3M8Pz4gdHlwZUZyb21Vc2VyID0gQ2xhc3MuZm9yTmFtZSgiT2JqZWN0IiArIGlucHV0RnJvbVVzZXIpOwoJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yID0gdHlwZUZyb21Vc2VyLmdldERlY2xhcmVkQ29uc3RydWN0b3IoSW50ZWdlci5UWVBFLCBJbnRlZ2VyLlRZUEUpOwoJCU9iamVjdCBvYmogPSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgxMCwgMTApOwoJCW8gPSAoR2VuZXJpY09iamVjdCkgb2JqOwoJCQogICAgICAgIG8ud2goKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oby53KTsgLy8gT3V0cHV0OiAzICh0aGF0J3Mgd2hhdCBJIHdhbm5hIG9idGFpbikKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oby5oKTsgLy8gT3V0cHV0OiAxMCAodGhhdCdzIHdoYXQgSSB3YW5uYSBvYnRhaW4pCgl9Cn0KCmFic3RyYWN0IGNsYXNzIEdlbmVyaWNPYmplY3QgewogICAgICAgICAgICBpbnQgdywgaCwgeCwgeTsKICAgICAgICAgICAgR2VuZXJpY09iamVjdCAoaW50IHgsIGludCB5KSB7CiAgICAgICAgICAgICAgICB0aGlzLnggPSB4OwogICAgICAgICAgICAgICAgdGhpcy55ID0geTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3aCgpOwogICAgICAgIH0KICAgICAgICBjbGFzcyBPYmplY3QxIGV4dGVuZHMgR2VuZXJpY09iamVjdHsKICAgICAgICAgICAgT2JqZWN0MSAoaW50IHgsIGludCB5KSB7CiAgICAgICAgICAgICAgICBzdXBlcih4LCB5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgcHVibGljIHZvaWQgd2ggKCkgewogICAgICAgICAgICAgICAgdyA9IDM7CiAgICAgICAgICAgICAgICBoID0gMTA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2xhc3MgT2JqZWN0MiBleHRlbmRzIEdlbmVyaWNPYmplY3R7CiAgICAgICAgICAgIE9iamVjdDIgKGludCB4LCBpbnQgeSkgewogICAgICAgICAgICAgICAgc3VwZXIoeCwgeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdoICgpIHsKICAgICAgICAgICAgICAgIHcgPSA3OwogICAgICAgICAgICAgICAgaCA9IDQ7CiAgICAgICAgICAgIH0KICAgICAgICB9