मेरे पास एक आधार वर्ग A है (जो कभी भी अपने मूल रूप में तत्काल नहीं होता है) जो कि कई बाल वर्गों के माता-पिता हैं। A का एक फंक्शन है जो हर चाइल्ड क्लास को विरासत में मिलता है, जिसे func कहा जाता है। प्रत्येक चाइल्ड क्लास में func का अलग-अलग कार्यान्वयन होता है लेकिन प्रत्येक का इनपुट और आउटपुट समान होता है।

में

virtual void func();

और प्रत्येक बाल वर्ग में

void func();

इस कोड को बनाए रखते हुए मुझे एहसास हुआ कि मैं वास्तव में इस फ़ंक्शन के लिए एक पैरामीटर पास करना चाहता हूं, जैसे कि

virtual void func(float foo);

मैंने तब, जाहिरा तौर पर भोलेपन से, यह मान लिया था कि इस फ़ंक्शन को प्राप्त करने वाला प्रत्येक वर्ग इस पैरामीटर को लेने और उपयोग करने में सक्षम होगा, लेकिन ऐसा लगता है कि अब मुझे प्रत्येक बच्चे के वर्ग से गुजरना होगा और उनके कार्यान्वयन में float foo जोड़ना होगा। func() की परिभाषा, उनमें से प्रत्येक के लिए void func(float foo); जोड़ना। क्या इस तरह के डुप्लिकेट परिवर्तन ठीक उसी तरह नहीं हैं जैसे OOP से बचने में मदद करने के लिए माना जाता है? मैं बेस क्लास के सदस्यों को उनकी घोषणाओं की नकल करने की आवश्यकता के बिना एक्सेस कर सकता हूं। मेरा प्रश्न यह है कि क्या मैं virtual फ़ंक्शन का दुरुपयोग कर रहा हूं, क्या मेरे मनचाहे व्यवहार को प्राप्त करने का कोई तरीका है या यह केवल कुछ ऐसा है जिसे बदलने के लिए दर्द होता है?

0
Jay 14 अप्रैल 2020, 20:18

1 उत्तर

सबसे बढ़िया उत्तर

इस समस्या के समाधान के लिए मैं एक डेटा संरचना तैयार करना चाहता हूं जिसे मैं प्रत्येक विरासत कार्यों में संदर्भ से पास करता हूं।

// in parent
virtual void func(Data * _data);

// in child
void func(Data * _data);

public struct Data
{
    float foo;
}

इस तरह अगर मैं कभी भी कार्यों में अतिरिक्त इनपुट जोड़ना चाहता हूं तो मैं बस बदल सकता हूं

public struct Data
{
    float foo;

    int bar; // only changed here!
}

और पूरे कार्यक्रम में मेरे संपादनों की नकल करने की आवश्यकता नहीं है (शायद प्रदर्शन पर मामूली प्रभाव, एक अतिरिक्त मेमोरी लुकअप)

0
Jay 12 मई 2020, 10:20