/ / कैसे कुशलता से अधिभार और बहुरूपता का उपयोग करें - जावा, बहुरूपता, विधि-अधिभार

ओवरलोड और बहुरूपता का कितनी कुशलता से उपयोग करते हैं - जावा, बहुरूपता, विधि-अतिभार

मेरे पास एक BaseObj:

public abstract class BaseObj {
String name;
public BaseObj(String _name) {
name = _name;
}

public void report(){
System.out.println(name + " is " + getType());
}

public abstract String getType();

}

और दो उपवर्ग Sample1 तथा Sample2:

public class Sample1 extends BaseObj{
private float var;
public Sample1(String name,float _var){
super(name);
var = _var;
}

@Override
public String getType() {
return "Float: " + Float.toString(var);
}
}

तथा

public class Sample2 extends BaseObj{
private int var;
public Sample2(String name , int _var){
super(name);
var = _var;
}

@Override
public String getType() {
return "Integer: " + Integer.toString(var);
}

}

मुख्य कॉल्स में:

public class Poly {
public static void main(String[] args){
BaseObj mObj[] = new BaseObj[4];

// Hard-definition of the object tyte
mObj[0] = new Sample1("X1",(float)12.34);
mObj[1] = new Sample2("X2",12);
mObj[2] = new Sample2("X3",12);
mObj[3] = new Sample1("X4",(float)1.2);

for(BaseObj x:mObj){
x.report();
}
}
}

मुझे mObj तत्वों के प्रकार को हार्ड-डिफाइन करना है। लेकिन मैं इसका उपयोग करने का एक तरीका खोज रहा हूं overload इस प्रकार की कठोर परिभाषा से बचने के लिए, उदा. एक नई कक्षा में मैं अपने इनपुट के आधार पर सही वस्तु प्राप्त करने के लिए अधिभार का उपयोग करता हूं:

public class Sample{
public Sample(String _name , int _var){
// get Sample2 object
}
public Sample(String _name , float _var){
// get Sample1 object
}
}

तब मैं अपने मुख्य calss का कोड इस प्रकार बदल पाऊंगा:

public class Poly {
public static void main(String[] args){
BaseObj mObj[] = new BaseObj[4];

mObj[0] = new Sample("X1",(float)12.34);
mObj[1] = new Sample("X2",12);
mObj[2] = new Sample("X3",12);
mObj[3] = new Sample("X4",(float)1.2);

for(BaseObj x:mObj){
x.report();
}
}
}

उत्पादन वर्तमान में इस प्रकार है:

X1 is Float: 12.34
X2 is Integer: 12
X3 is Integer: 12
X4 is Float: 1.2

संपादित करें: एमओबीजे के तत्वों को परिभाषित करने के लिए मुझे वास्तव में क्या चाहिए new Sample("X1",var) और उनमें से कुछ के रूप में नहीं new Sample1("X1",(float)12.34) और कुछ के रूप में new Sample2("X1",12). इसके लिए मुझे कक्षा के निर्माणकर्ताओं में अपनी वस्तु के प्रकार के बारे में निर्णय लेना चाहिए Sample. क्या किसी के पास कोई विचार है? धन्यवाद

उत्तर:

उत्तर № 1 के लिए 1

मुझे लगता है कि आप यहां फ़ैक्टरी विधि की तलाश में हैं।

public class BaseObjFactory {
public static BaseObj create(String name, int value) {
return new Sample2(name, value);
}

public static BaseObj create(String name, float value) {
return new Sample1(name, value);
}
}

और इसे इस तरह इस्तेमाल करें

mObj[0] = BaseObjFactory.create("X1",12.34f);
mObj[1] = BaseObjFactory.create("X2",12);
mObj[2] = BaseObjFactory.create("X3",12);
mObj[3] = BaseObjFactory.create("X4",1.2f);

बीटीडब्ल्यू। कास्ट का उपयोग करने की आवश्यकता नहीं है (float)1.2, बस एक संलग्न करें f इसे बनाने के लिए एक float शाब्दिक।


उत्तर № 2 के लिए 1

कारखाने के तरीकों का प्रयोग करें।

class SampleFactory {
Sample1 create(String name, int value) {
return new Sample1(name, value);
}

Sample2 create(String name, float value) {
return new Sample2(name, value);
}
}

तब आप इसका उपयोग कर सकते हैं

mObj[0] = SampleFactory.create("X1",(float)12.34);
mObj[1] = SampleFactory.create("X2",12);
mObj[2] = SampleFactory.create("X3",12);
mObj[3] = SampleFactory.create("X4",(float)1.2);

जवाब के लिए 0 № 3

मेरा सुझाव है कि आप जो हासिल करने की कोशिश कर रहे हैं उसके लिए आप सबसे सरल समाधान से शुरू करें।

public class Poly {
public static void main(String[] args) {
Sample[] mObj = {
new Sample("X1", 12.34f),
new Sample("X2", 12),
new Sample("X3", 12),
new Sample("X4", 1.2f)
};

for (Sample x : mObj)
x.report();
}
}

class Sample {
private final String desc;
private final Number value;

public Sample(String desc, Number value) {
this.desc = desc;
this.value = value;
}

public void report() {
System.out.println(desc + " is a " + value.getClass().getSimpleName() + ": " + value);
}
}

प्रिंट

X1 is a Float: 12.34
X2 is a Integer: 12
X3 is a Integer: 12
X4 is a Float: 1.2

यह बहुरूपता का उपयोग करता है जिसमें फ्लोट और इंटीजर संख्या के उपवर्ग हैं।