"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > संरचना बनाम वंशानुक्रम

संरचना बनाम वंशानुक्रम

2024-11-09 को प्रकाशित
ब्राउज़ करें:388

Composición vs Herencia

परिचय

विरासत और संरचना ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (ओओपी) में दो मूलभूत अवधारणाएं हैं, लेकिन उनका उपयोग अलग-अलग तरीके से किया जाता है और उनके अलग-अलग उद्देश्य होते हैं। इस पोस्ट का उद्देश्य उन उद्देश्यों की समीक्षा करना है, और उन्हें चुनते समय कुछ बातों को ध्यान में रखना है।

विरासत की अवधारणाएँ

जब हम अपने डिजाइनों में विरासत को लागू करने के बारे में सोचते हैं, तो हमें यह समझना होगा:

  • परिभाषा: वंशानुक्रम में, एक वर्ग (जिसे व्युत्पन्न वर्ग या उपवर्ग कहा जाता है) किसी अन्य वर्ग (जिसे आधार वर्ग या सुपरक्लास कहा जाता है) से गुण और व्यवहार प्राप्त कर सकता है। व्युत्पन्न वर्ग बेस क्लास की कार्यक्षमता को बढ़ा या संशोधित कर सकता है।
  • रिश्ता: यह एक रिश्ता है "एक है" (है-एक)। उदाहरण के लिए, यदि आपके पास एक वर्ग "वाहन" और दूसरा वर्ग "कार" है, तो वर्ग "कार" "वाहन" का एक उपवर्ग है।
  • फायदे: कोड के पुन: उपयोग को बढ़ावा देता है और कार्यक्षमता के आसान विस्तार की अनुमति देता है।

रचना अवधारणाएँ

दूसरी ओर, यदि हम वस्तुओं को एक साथ बनाने के बारे में सोचते हैं:

  • परिभाषा: संरचना में, एक वस्तु में अन्य वस्तुएं शामिल होती हैं और अपनी कार्यक्षमता का हिस्सा उन्हें सौंपती है। वंशानुक्रम के बजाय, एक वर्ग अपनी कार्यक्षमता प्राप्त करने के लिए अन्य वर्गों के उदाहरणों का उपयोग करता है।
  • रिश्ता: यह एक "है-ए" रिश्ता है। उदाहरण के लिए, यदि आपके पास एक वर्ग "इंजन" और एक वर्ग "कार" है, तो वर्ग "कार" में वर्ग "इंजन" का एक ऑब्जेक्ट हो सकता है।
  • फायदे: कक्षाओं के बीच अधिक लचीलापन और कम युग्मन। एक वर्ग में परिवर्तन दूसरे वर्ग पर सीधे प्रभाव नहीं डालता।

विरासत पर रचना क्यों?

यह सवाल कि क्या संरचना विरासत से बेहतर है या इसके विपरीत, सॉफ्टवेयर डिजाइन में एक बहस का विषय है। दोनों दृष्टिकोणों के अपने फायदे और नुकसान हैं, और चुनाव विशिष्ट परियोजना संदर्भ और आवश्यकताओं पर निर्भर करता है। यहां मैं आपको एक उदाहरण प्रस्तुत करूंगा जहां विरासत की तुलना में रचना को प्राथमिकता दी जा सकती है।

आइए जावा में एक उदाहरण देखें जो दर्शाता है कि कुछ मामलों में विरासत के लिए संरचना कैसे बेहतर हो सकती है। मान लीजिए हम एक ऑनलाइन स्टोर में ऑर्डर प्रोसेसिंग सिस्टम पर काम कर रहे हैं।

  • विरासत दृष्टिकोण:

सबसे पहले, आइए किताबों और इलेक्ट्रॉनिक्स जैसे विभिन्न प्रकार के क्रय योग्य उत्पादों का प्रतिनिधित्व करने के लिए विरासत का उपयोग करने वाले दृष्टिकोण पर विचार करें:

// Clase base para productos
class Producto {
    String nombre;
    double precio;

    Producto(String nombre, double precio) {
        this.nombre = nombre;
        this.precio = precio;
    }

    void procesarPedido() {
        System.out.println("Procesando pedido para "   nombre);
    }
}

// Clase para productos electrónicos que hereda de Producto
class ProductoElectronico extends Producto {
    String modelo;

    ProductoElectronico(String nombre, double precio, String modelo) {
        super(nombre, precio);
        this.modelo = modelo;
    }
}

// Clase para libros que hereda de Producto
class Libro extends Producto {
    String autor;

    Libro(String nombre, double precio, String autor) {
        super(nombre, precio);
        this.autor = autor;
    }
}

यह दृष्टिकोण काम करता है, लेकिन क्या होगा यदि आपको नए उत्पाद प्रकार पेश करने या कुछ उत्पाद प्रकारों के लिए विशिष्ट कार्यक्षमता जोड़ने की आवश्यकता है?

  • रचना के साथ फोकस:

विरासत पर पूरी तरह निर्भर रहने के बजाय, हम विभिन्न प्रकार के उत्पादों को अधिक लचीले ढंग से संभालने के लिए संरचना का उपयोग कर सकते हैं:

// Clase para productos
class Producto {
    String nombre;
    double precio;

    Producto(String nombre, double precio) {
        this.nombre = nombre;
        this.precio = precio;
    }

    void procesarPedido() {
        System.out.println("Procesando pedido para "   nombre);
    }
}

// Clase para productos electrónicos que utiliza composición
class ProductoElectronico {
    Producto producto;
    String modelo;

    ProductoElectronico(String nombre, double precio, String modelo) {
        this.producto = new Producto(nombre, precio);
        this.modelo = modelo;
    }

    // Puedes agregar lógica específica para productos electrónicos si es necesario
    void procesarPedidoEspecifico() {
        System.out.println("Procesando pedido específico para "   producto.nombre);
    }
}

// Clase para libros que utiliza composición
class Libro {
    Producto producto;
    String autor;

    Libro(String nombre, double precio, String autor) {
        this.producto = new Producto(nombre, precio);
        this.autor = autor;
    }

    // Puedes agregar lógica específica para libros si es necesario
    void procesarPedidoEspecifico() {
        System.out.println("Procesando pedido específico para "   producto.nombre);
    }
}

इस दृष्टिकोण में, प्रत्येक उत्पाद प्रकार में उत्पाद वर्ग का एक उदाहरण होता है, जो प्रोसेसिंग ऑर्डर के लिए सामान्य तर्क साझा करने की अनुमति देता है। इसके अतिरिक्त, प्रत्येक उत्पाद प्रकार के पास प्रोसेसस्पेसिफिकऑर्डर() जैसी विधियों का उपयोग करके अपना विशिष्ट तर्क हो सकता है। यह डिज़ाइन अधिक लचीला है और वंशानुक्रम पदानुक्रम को प्रभावित किए बिना नए उत्पाद प्रकारों को पेश करना या प्रकार-विशिष्ट तर्क को संशोधित करना आसान बनाता है।

विरासत कब लागू करें?

हालांकि सॉफ़्टवेयर डिज़ाइन में वंशानुक्रम और संरचना के बीच का चुनाव उस समस्या के संदर्भ और विशिष्ट आवश्यकताओं पर निर्भर करता है जिसे आप संबोधित कर रहे हैं। यहां कुछ स्थितियां हैं जहां आप विरासत को संरचना की तुलना में अधिक उपयुक्त विकल्प मान सकते हैं:

  • "is-a" संबंध: जब वर्गों के बीच स्पष्ट "is-a" संबंध होता है तो वंशानुक्रम विशेष रूप से उपयुक्त होता है। यदि वर्ग बी वर्ग ए का अधिक विशिष्ट या विशिष्ट संस्करण है, तो वंशानुक्रम समझ में आता है। उदाहरण के लिए, यदि आपके पास वाहन वर्ग और कार वर्ग है, तो "है-ए" संबंध स्पष्ट है, क्योंकि कार एक प्रकार का वाहन है।
class Vehiculo {
    // ...
}

class Automovil extends Vehiculo {
    // ...
}
  • कोड का पुन: उपयोग: इनहेरिटेंस कोड के पुन: उपयोग की अनुमति देता है, क्योंकि व्युत्पन्न वर्ग को बेस क्लास के सदस्यों और तरीकों को विरासत में मिलता है। यह तब फायदेमंद हो सकता है जब संबंधित वर्गों के बीच महत्वपूर्ण मात्रा में सामान्य कोड हो।
class Animal {
    void comer() {
        // Lógica común para comer
    }
}

class Perro extends Animal {
    void ladrar() {
        // Lógica específica para ladrar
    }
}
  • बहुरूपता: बहुरूपता के कार्यान्वयन के लिए वंशानुक्रम मौलिक है, जो व्युत्पन्न वर्गों को आधार वर्ग से विरासत में मिली विधियों के विशिष्ट कार्यान्वयन प्रदान करने की अनुमति देता है। यह उन परिदृश्यों में उपयोगी है जहां आपको व्युत्पन्न वर्गों की वस्तुओं को समान रूप से व्यवहार करने की आवश्यकता होती है।
class Figura {
    void dibujar() {
        // Lógica común para dibujar una figura
    }
}

class Circulo extends Figura {
    void dibujar() {
        // Lógica específica para dibujar un círculo
    }
}

class Cuadrado extends Figura {
    void dibujar() {
        // Lógica específica para dibujar un cuadrado
    }
}

  • कार्यक्षमता एक्सटेंशन: यदि आप मौजूदा कार्यक्षमता का विस्तार या विशेषज्ञता कर रहे हैं, तो विरासत अधिक स्वाभाविक हो सकती है। उदाहरण के लिए, यदि आप एक लाइब्रेरी विकसित कर रहे हैं और आप बुनियादी कार्यक्षमता के साथ एक बेस क्लास प्रदान करते हैं, तो आपकी लाइब्रेरी के उपयोगकर्ता उस कार्यक्षमता को बढ़ाने के लिए उस बेस क्लास से प्राप्त कर सकते हैं।

यदि हम ख़राब विरासत बनाते हैं तो क्या होगा?

यदि हम विरासत के पेशेवरों और विपक्षों का मूल्यांकन करना जारी रखते हैं, तो खराब विरासत से उत्पन्न होने वाली समस्याओं में से एक यह है कि हम इंटरफ़ेस पृथक्करण सिद्धांत का उल्लंघन करेंगे, जिसमें कहा गया है कि ग्राहकों को उन इंटरफेस पर निर्भर होने के लिए मजबूर नहीं किया जाना चाहिए जो वे करते हैं। का उपयोग नहीं। यदि एक इंटरफ़ेस को ऐसे तरीके से विस्तारित किया जाता है जिसमें ऐसी विधियां शामिल होती हैं जो सभी कार्यान्वयन के लिए प्रासंगिक नहीं होती हैं, तो उस इंटरफ़ेस का उपयोग करने वाले ग्राहकों को उन तरीकों को लागू करने या उन पर निर्भर होने के लिए मजबूर किया जा सकता है जिनकी उन्हें आवश्यकता नहीं है, जिससे कम साफ और अधिक कठिन डिज़ाइन हो सकता है बनाए रखना।

निष्कर्ष

संक्षेप में, वंशानुक्रम "एक है" संबंध पर केंद्रित है और इसका उपयोग वर्ग पदानुक्रमों को मॉडल करने के लिए किया जाता है, जबकि रचना "एक है" संबंध पर केंद्रित है और इसका उपयोग अन्य सरल वस्तुओं से जटिल वस्तुओं के निर्माण के लिए किया जाता है। दोनों दृष्टिकोणों के अपने विशिष्ट उपयोग के मामले हैं और इन्हें सॉफ़्टवेयर डिज़ाइन में संबंधों की संरचना और प्रकृति के आधार पर चुना जाता है।

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/rlgino/composicion-vs-herencia-4664?1 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए [email protected] से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3