मुझे अचानक जावा में गहरी पॉलिमॉर्फिक प्रति बनाने की समस्या का सामना करना पड़ा है। कार्यान्वयन क्लोनबल मेरे मामले में समस्या हल करता है, लेकिन इसे अक्सर "खराब" तकनीक के रूप में जाना जाता है।जावा में पॉलिमॉर्फिक प्रति
public class Parent {
int x;
public Parent() {}
public Parent(int x0) {
x = x0;
}
public Parent copy() {
Parent b = new Parent();
b.assign(this);
return b;
}
protected void assign(Parent c) {
x = c.x;
}
@Override
public String toString() {
return getClass().getName() + ", " + x;
}
}
public class Child extends Parent {
int y;
protected Child() {}
public Child(int x0, int y0) {
super(x0);
y = y0;
}
@Override
public Child copy() {
Child b = new Child();
b.assign(this);
return b;
}
@Override
protected void assign(Child c) {
super.assign(c);
y = c.y;
}
@Override
public String toString() {
return getClass().getName() + ", " + x + "," + y;
}
}
public class Test {
public static void main(String[] args) {
Parent x = new Parent(5);
Child y = new Child(10, 20);
Parent z = x.copy();
Parent w = y.copy();
System.out.println(x);
System.out.println(y);
System.out.println(z);
System.out.println(w);
}
}
उत्पादन होता है:
com.xxx.zzz.Parent, 5
com.xxx.zzz.Child, 10,20
com.xxx.zzz.Parent, 5
com.xxx.zzz.Child, 10,20
और एक और (कम) एक ही ऐसा करने का तरीका (का उपयोग कर
तो, यहाँ एक "नहीं-Clonable" समाधान खोजने के लिए मेरे प्रयास कर रहे हैं प्रतिबिंब):
public class Parent {
int x;
public Parent() {}
public Parent(int x0) {
x = x0;
}
public Parent copy() {
try {
Parent b = getClass().newInstance();
b.assign(this);
return b;
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
return null;
}
}
protected void assign(Parent c) {
x = c.x;
}
@Override
public String toString() {
return getClass().getName() + ", " + x;
}
}
public class Child extends Parent {
int y;
protected Child() {}
public Child(int x0, int y0) {
super(x0);
y = y0;
}
protected void assign(Child c) {
super.assign(c);
y = c.y;
}
@Override
public String toString() {
return getClass().getName() + ", " + x + "," + y;
}
}
बाल वर्ग में प्रतिलिपि प्रतिलिपि() की आवश्यकता नहीं है। लेकिन मुझे यकीन नहीं है कि getClass() का उपयोग करना कितना 'कानूनी' है। एक प्रति प्लेसहोल्डर बनाने के लिए नयाInstance() ...
क्या उपयोग करने के लायक समाधान या अधिक सामान्य/मजबूत/सरल दृष्टिकोण हैं?
धन्यवाद!
यदि बच्चे के पास डिफॉल्ट कन्स्ट्रक्टर है तो यह काम नहीं करता है। –