क्या संरचना और वंशानुक्रम समान हैं? यदि मैं रचना पैटर्न को लागू करना चाहता हूं, तो मैं जावा में कैसे कर सकता हूं?
क्या संरचना और वंशानुक्रम समान हैं? यदि मैं रचना पैटर्न को लागू करना चाहता हूं, तो मैं जावा में कैसे कर सकता हूं?
जवाबों:
वे बिल्कुल अलग हैं। विरासत एक "एक-एक" रिश्ता है। रचना एक "है-एक" है ।
आप C
अपने वर्ग के क्षेत्र के रूप में एक और वर्ग का उदाहरण देकर रचना करते हैं , इसके बजाय विस्तार करने की C
। एक अच्छा उदाहरण जहां रचना वंशानुक्रम की तुलना में बहुत बेहतर होती है java.util.Stack
, जो वर्तमान में फैली हुई है java.util.Vector
। इसे अब एक दोष माना जाता है। एक स्टैक "नहीं है" वेक्टर; आपको मनमाने ढंग से तत्वों को सम्मिलित करने और हटाने की अनुमति नहीं दी जानी चाहिए। इसके बजाय इसकी रचना होनी चाहिए थी।
दुर्भाग्य से इस डिज़ाइन की गलती को सुधारने में बहुत देर हो चुकी है, क्योंकि अब वंशानुक्रम पदानुक्रम बदलने से मौजूदा कोड के साथ संगतता टूट जाएगी। विरासत के बजाय रचना का उपयोग किया था Stack
, यह हमेशा एपीआई का उल्लंघन किए बिना किसी अन्य डेटा संरचना का उपयोग करने के लिए संशोधित किया जा सकता है ।
मैं जोश बलोच की किताब इफेक्टिव जावा 2 एडिशन की अत्यधिक अनुशंसा करता हूं
अच्छा ऑब्जेक्ट-ओरिएंटेड डिज़ाइन उदारतापूर्वक मौजूदा कक्षाओं को बढ़ाने के बारे में नहीं है। आपकी पहली वृत्ति इसके बजाय रचना के लिए होनी चाहिए।
यह सभी देखें:
रचना का अर्थ है HAS A
इनहेरिटेंसIS A
Example
: कार में एक इंजन है और कार एक ऑटोमोबाइल है
प्रोग्रामिंग में इसे इस प्रकार दर्शाया गया है:
class Engine {} // The Engine class.
class Automobile {} // Automobile class which is parent to Car class.
class Car extends Automobile { // Car is an Automobile, so Car class extends Automobile class.
private Engine engine; // Car has an Engine so, Car class has an instance of Engine class as its member.
}
:-/
type
फ़ील्ड का प्रकार हो सकता हैEnum
वंशानुक्रम खतरनाक कैसे हो सकता है?
एक उदाहरण लेते हैं
public class X{
public void do(){
}
}
Public Class Y extends X{
public void work(){
do();
}
}
1) जैसा कि ऊपर दिए गए कोड में स्पष्ट है, दसवीं कक्षा के साथ क्लास वाई में बहुत मजबूत युग्मन है। यदि सुपरक्लास एक्स में कुछ भी बदलता है, तो वाई नाटकीय रूप से बदल सकता है। मान लीजिए कि भविष्य की कक्षा X में हस्ताक्षर के नीचे विधि विधि लागू है
public int work(){
}
परिवर्तन दसवीं कक्षा में किया जाता है लेकिन यह कक्षा Y को असंगत बना देगा। तो इस तरह की निर्भरता किसी भी स्तर तक जा सकती है और यह बहुत खतरनाक हो सकती है। हर बार सुपरक्लास के पास अपने सभी उपवर्गों के अंदर कोड करने के लिए पूरी दृश्यता नहीं हो सकती है और सबक्लास हर समय सुपरक्लास में हो रही घटनाओं को ध्यान में रख सकते हैं। इसलिए हमें इस मजबूत और अनावश्यक युग्मन से बचने की जरूरत है।
रचना इस मुद्दे को कैसे हल करती है?
उसी उदाहरण को संशोधित करके देखते हैं
public class X{
public void do(){
}
}
Public Class Y{
X x = new X();
public void work(){
x.do();
}
}
यहाँ हम Y क्लास में X क्लास का संदर्भ बना रहे हैं और X क्लास का एक उदाहरण बनाकर X क्लास का इनवोकेशन मेथड बना रहे हैं। अब वह सब मजबूत युग्मन चला गया है। सुपरक्लास और उपवर्ग अब एक दूसरे से अत्यधिक स्वतंत्र हैं। कक्षाएं स्वतंत्र रूप से परिवर्तन कर सकती हैं जो विरासत की स्थिति में खतरनाक थे।
2) इसमें रचना का दूसरा बहुत अच्छा लाभ यह उदाहरण के लिए विधि कॉलिंग लचीलापन प्रदान करता है:
class X implements R
{}
class Y implements R
{}
public class Test{
R r;
}
आर संदर्भ का उपयोग करके टेस्ट क्लास में मैं एक्स क्लास के साथ-साथ वाई क्लास के तरीके भी लागू कर सकता हूं। विरासत में यह लचीलापन कभी नहीं था
3) एक और महान लाभ: इकाई परीक्षण
public class X {
public void do(){
}
}
Public Class Y {
X x = new X();
public void work(){
x.do();
}
}
उपरोक्त उदाहरण में, यदि x उदाहरण की स्थिति ज्ञात नहीं है, तो इसे कुछ परीक्षण डेटा का उपयोग करके आसानी से मजाक किया जा सकता है और सभी तरीकों को आसानी से परीक्षण किया जा सकता है। यह वंशानुक्रम में बिल्कुल भी संभव नहीं था क्योंकि आप उदाहरण की स्थिति प्राप्त करने और किसी भी विधि को निष्पादित करने के लिए सुपरक्लास पर बहुत अधिक निर्भर थे।
4) हमें विरासत से बचना चाहिए एक और अच्छा कारण यह है कि जावा कई विरासतों का समर्थन नहीं करता है।
इसे समझने के लिए एक उदाहरण लेते हैं:
Public class Transaction {
Banking b;
public static void main(String a[])
{
b = new Deposit();
if(b.deposit()){
b = new Credit();
c.credit();
}
}
}
जानकार अच्छा लगा :
रचना आसानी से रनटाइम पर हासिल की जाती है जबकि विरासत संकलन समय पर अपनी विशेषताएं प्रदान करती है
रचना को एचएएस-ए संबंध के रूप में भी जाना जाता है और विरासत को आईएस-ए संबंध के रूप में भी जाना जाता है
इसलिए इसे उपरोक्त विभिन्न कारणों से वंशानुक्रम पर हमेशा पसंदीदा रचना की आदत बनाएं।
@ मिचेल रोड्रिग्स द्वारा दिया गया उत्तर सही नहीं है (मैं माफी माँगता हूँ; मैं सीधे टिप्पणी करने में सक्षम नहीं हूँ), और कुछ भ्रम हो सकता है।
इंटरफ़ेस कार्यान्वयन विरासत का एक रूप है ... जब आप एक इंटरफ़ेस लागू करते हैं, तो आप न केवल सभी स्थिरांक को विरासत में प्राप्त कर रहे हैं, आप अपनी वस्तु को इंटरफ़ेस द्वारा निर्दिष्ट प्रकार के होने के लिए प्रतिबद्ध कर रहे हैं; यह अभी भी एक " एक-एक " रिश्ता है। यदि कोई कार फिलेबल को लागू करती है , तो कार " ए " फिलेबल है , और आपके कोड में जहां भी आप फिलेबल का उपयोग करेंगे, उसका उपयोग किया जा सकता है ।
रचना मूल रूप से विरासत से अलग है। आप रचना का उपयोग करते हैं, आप कर रहे हैं (जैसा कि अन्य उत्तर ध्यान दें) एक "बना रही है-एक के रूप में" के लिए विरोध "दो वस्तुओं के बीच संबंध, है-एक " रिश्ता है कि आप जब आप विरासत का उपयोग कर ।
इसलिए, कार के अन्य उदाहरणों में, यदि मैं कहना चाहता हूं कि कार में "गैस टैंक" है, तो मैं निम्नानुसार रचना का उपयोग करूंगा:
public class Car {
private GasTank myCarsGasTank;
}
उम्मीद है कि किसी भी गलतफहमी को दूर करता है।
इनहेरिटेंस आईएस-ए रिलेशन को सामने लाता है । रचना से एचएएस-ए संबंध सामने आता है । रणनीति पैटर्न समझाता है कि रचना का उपयोग उन मामलों में किया जाना चाहिए जहां एल्गोरिदम के परिवार एक विशेष व्यवहार को परिभाषित करते हैं।
एक बतख वर्ग का क्लासिक उदाहरण जो एक उड़ान व्यवहार को लागू करता है।
public interface Flyable{
public void fly();
}
public class Duck {
Flyable fly;
public Duck(){
fly = new BackwardFlying();
}
}
इस प्रकार हमारे पास कई वर्ग हो सकते हैं जो उड़ान को लागू करते हैं जैसे:
public class BackwardFlying implements Flyable{
public void fly(){
Systemout.println("Flies backward ");
}
}
public class FastFlying implements Flyable{
public void fly(){
Systemout.println("Flies 100 miles/sec");
}
}
अगर यह वंशानुक्रम के लिए होता, तो हमारे पास पक्षियों के दो अलग-अलग वर्ग होते जो मक्खी के कार्य को बार-बार कार्यान्वित करते। तो विरासत और रचना पूरी तरह से अलग हैं।
संरचना बस के रूप में यह लगता है - आप भागों में प्लग द्वारा एक वस्तु बनाते हैं।
इस उत्तर के बाकी हिस्से को गलत तरीके से निम्नलिखित आधार पर संपादित करें ।
यह इंटरफेसेस के साथ पूरा किया जाता है।
उदाहरण के लिए, Car
ऊपर दिए गए उदाहरण का उपयोग करते हुए ,
Car implements iDrivable, iUsesFuel, iProtectsOccupants
Motorbike implements iDrivable, iUsesFuel, iShortcutThroughTraffic
House implements iProtectsOccupants
Generator implements iUsesFuel
तो कुछ मानक सैद्धांतिक घटकों के साथ आप अपनी वस्तु का निर्माण कर सकते हैं। फिर यह आपका काम है कि कैसे House
अपने रहने वालों की रक्षा की जाए और कैसे Car
अपने रहने वालों की सुरक्षा की जाए।
इनहेरिटेंस दूसरे तरीके की तरह है। आप एक पूर्ण (या अर्ध-पूर्ण) ऑब्जेक्ट के साथ शुरू करते हैं और आप उन विभिन्न बिट्स को प्रतिस्थापित या ओवरराइड करते हैं जिन्हें आप बदलना चाहते हैं।
उदाहरण के लिए, MotorVehicle
एक Fuelable
विधि और Drive
विधि के साथ आ सकता है । आप ईंधन विधि को छोड़ सकते हैं क्योंकि यह एक मोटरबाइक और कार को भरने के लिए समान है, लेकिन आप इस Drive
विधि को ओवरराइड कर सकते हैं क्योंकि मोटरबाइक बहुत अलग तरीके से ड्राइव करता है Car
।
विरासत के साथ, कुछ कक्षाएं पहले से ही पूरी तरह से लागू होती हैं, और दूसरों के पास ऐसे तरीके हैं जिन्हें आप ओवरराइड करने के लिए मजबूर हैं। रचना के साथ आपको कुछ नहीं दिया गया है। (लेकिन आप अन्य कक्षाओं में तरीकों को कॉल करके इंटरफेस को लागू कर सकते हैं यदि आपके पास कुछ बिछाने के लिए होता है)।
संरचना को अधिक लचीले के रूप में देखा जाता है, क्योंकि यदि आपके पास एक विधि है जैसे कि iUsesFuel, तो आपके पास एक विधि कहीं और हो सकती है (एक अन्य वर्ग, एक अन्य परियोजना) जो बस ईंधन वाली वस्तुओं से निपटने के बारे में चिंतित है, चाहे वह एक कार हो। नाव, स्टोव, बारबेक्यू, आदि इंटरफेस को अनिवार्य करते हैं जो कहते हैं कि वे उस इंटरफ़ेस को लागू करते हैं वास्तव में वे तरीके हैं जो उस इंटरफ़ेस के बारे में हैं। उदाहरण के लिए,
iFuelable Interface:
void AddSomeFuel()
void UseSomeFuel()
int percentageFull()
तब आपके पास कहीं और विधि हो सकती है
private void FillHerUp(iFuelable : objectToFill) {
Do while (objectToFill.percentageFull() <= 100) {
objectToFill.AddSomeFuel();
}
अजीब उदाहरण है, लेकिन यह दर्शाता है कि यह विधि परवाह नहीं करती है कि यह क्या भर रहा है, क्योंकि ऑब्जेक्ट लागू होता है iUsesFuel
, इसे भरा जा सकता है। कहानी का अंत।
यदि आपने इसके बजाय वंशानुक्रम का उपयोग किया है, तो आपको FillHerUp
निपटने के लिए विभिन्न तरीकों की आवश्यकता होगी MotorVehicles
और Barbecues
, जब तक कि आपके पास कुछ अजीब "ObjectThatUsesFuel" बेस ऑब्जेक्ट न हो, जिसमें से वारिस करना है।
ThisCase
, अंदर नहीं camelCase
। इसलिए अपने इंटरफेस IDrivable
आदि को नाम देना सबसे अच्छा है , अगर आपको अपने सभी इंटरफेस को एक पैकेज में सही तरीके से रखने पर "I" की आवश्यकता नहीं है।
क्या संरचना और वंशानुक्रम समान हैं?
वे समान नहीं हैं।
रचना : यह वस्तुओं के एक समूह को उसी तरह से व्यवहार करने में सक्षम बनाता है जैसे किसी वस्तु के एकल उदाहरण के रूप में। एक समग्र का उद्देश्य भाग-पूरे पदानुक्रम का प्रतिनिधित्व करने के लिए पेड़ों की संरचनाओं में "रचना" करना है
वंशानुक्रम : एक वर्ग अपने सभी सुपरक्लास से खेतों और विधियों को विरासत में लेता है, चाहे वह प्रत्यक्ष या अप्रत्यक्ष हो। एक उपवर्ग उन विधियों को ओवरराइड कर सकता है जो इसे विरासत में मिली हैं, या यह उन क्षेत्रों या विधियों को छिपा सकती हैं जो इसे विरासत में मिली हैं।
यदि मैं रचना पैटर्न को लागू करना चाहता हूं, तो मैं जावा में कैसे कर सकता हूं?
विकिपीडिया लेख जावा में समग्र पैटर्न को लागू करने के लिए पर्याप्त है।
मुख्य प्रतिभागी:
घटक :
पत्ता :
समग्र :
समग्र पैटर्न को समझने के लिए कोड उदाहरण :
import java.util.List;
import java.util.ArrayList;
interface Part{
public double getPrice();
public String getName();
}
class Engine implements Part{
String name;
double price;
public Engine(String name,double price){
this.name = name;
this.price = price;
}
public double getPrice(){
return price;
}
public String getName(){
return name;
}
}
class Trunk implements Part{
String name;
double price;
public Trunk(String name,double price){
this.name = name;
this.price = price;
}
public double getPrice(){
return price;
}
public String getName(){
return name;
}
}
class Body implements Part{
String name;
double price;
public Body(String name,double price){
this.name = name;
this.price = price;
}
public double getPrice(){
return price;
}
public String getName(){
return name;
}
}
class Car implements Part{
List<Part> parts;
String name;
public Car(String name){
this.name = name;
parts = new ArrayList<Part>();
}
public void addPart(Part part){
parts.add(part);
}
public String getName(){
return name;
}
public String getPartNames(){
StringBuilder sb = new StringBuilder();
for ( Part part: parts){
sb.append(part.getName()).append(" ");
}
return sb.toString();
}
public double getPrice(){
double price = 0;
for ( Part part: parts){
price += part.getPrice();
}
return price;
}
}
public class CompositeDemo{
public static void main(String args[]){
Part engine = new Engine("DiselEngine",15000);
Part trunk = new Trunk("Trunk",10000);
Part body = new Body("Body",12000);
Car car = new Car("Innova");
car.addPart(engine);
car.addPart(trunk);
car.addPart(body);
double price = car.getPrice();
System.out.println("Car name:"+car.getName());
System.out.println("Car parts:"+car.getPartNames());
System.out.println("Car price:"+car.getPrice());
}
}
उत्पादन:
Car name:Innova
Car parts:DiselEngine Trunk Body
Car price:37000.0
स्पष्टीकरण:
पेशेवरों और रचना और विरासत के विपक्ष के लिए नीचे दिए गए प्रश्न का संदर्भ लें।
रचना वह है जहाँ कुछ अलग-अलग भागों से बना होता है और इसका उन भागों के साथ एक मजबूत रिश्ता होता है। यदि मुख्य भाग मर जाता है तो दूसरे करते हैं, उनका अपना जीवन नहीं हो सकता। एक मोटा उदाहरण मानव शरीर है। दिल को बाहर निकालें और अन्य सभी भाग मर जाते हैं।
वंशानुक्रम वह जगह है जहाँ आप कुछ ऐसा लेते हैं जो पहले से मौजूद है और इसका उपयोग करते हैं। कोई मजबूत रिश्ता नहीं है। एक व्यक्ति को अपने पिता की संपत्ति विरासत में मिल सकती है लेकिन वह इसके बिना कर सकता है।
मुझे जावा पता नहीं है इसलिए मैं एक उदाहरण नहीं दे सकता, लेकिन मैं अवधारणाओं का स्पष्टीकरण प्रदान कर सकता हूं।
दो वर्गों के बीच अंतर्ग्रहण , जहां एक वर्ग दूसरे वर्ग का विस्तार करता है, " आईएस ए " स्थापित करता है " संबंध ।
दूसरे छोर पर रचना में आपकी कक्षा में एक अन्य वर्ग का उदाहरण है " हैस ए " संबंध स्थापित करता है । जावा में संरचना उपयोगी है क्योंकि यह तकनीकी रूप से कई विरासत की सुविधा देता है।
सिंपल वर्ड एग्रीगेशन में मतलब है एक रिश्ता ।।
रचना एकत्रीकरण का एक विशेष मामला है । अधिक विशिष्ट तरीके से, एक प्रतिबंधित एकत्रीकरण को रचना कहा जाता है। जब एक वस्तु में दूसरी वस्तु होती है, यदि निहित वस्तु कंटेनर वस्तु के अस्तित्व के बिना मौजूद नहीं हो सकती है, तो इसे रचना कहा जाता है। उदाहरण: एक वर्ग में छात्र होते हैं। एक छात्र एक कक्षा के बिना मौजूद नहीं हो सकता। कक्षा और छात्रों के बीच रचना मौजूद है।
एग्रीगेशन का उपयोग क्यों करें
कोड पुन: प्रयोज्य
जब एकत्रीकरण का उपयोग करें
जब कोई रिलेशन शिप न हो तो कोड का पुन: उपयोग भी एकत्रीकरण द्वारा सर्वोत्तम रूप से प्राप्त किया जाता है
विरासत
इनहेरिटेंस एक पेरेंट चाइल्ड रिलेशनशिप इनहेरिटेंस मीन्स एक रिलेशनशिप है
जावा में निहितता एक तंत्र है जिसमें एक वस्तु मूल वस्तु के सभी गुणों और व्यवहारों को प्राप्त करती है।
जावा 1 कोड पुन: प्रयोज्य में विरासत का उपयोग करना। 2 चाइल्ड क्लास में एक्स्ट्रा फीचर जोड़ें और साथ ही मेथड ओवरराइडिंग (ताकि रनटाइम पॉलीमोर्फिज्म हासिल किया जा सके)।
हालाँकि, इनहेरिटेंस और कम्पोज़िशन दोनों कोड पुनरावृत्ति प्रदान करता है, लेकिन जावा में कम्पोज़िशन और इनहेरिटेंस के बीच मुख्य अंतर यह है कि रचना बिना कोड के पुन: उपयोग की अनुमति देता है, लेकिन Inheritance के लिए आपको कोड या कार्यक्षमता के किसी भी पुन: उपयोग के लिए वर्ग का विस्तार करना होगा। एक अन्य अंतर जो इस तथ्य से आता है वह यह है कि कम्पोज़िशन का उपयोग करके आप अंतिम वर्ग के लिए भी कोड का पुन: उपयोग कर सकते हैं जो कि एक्स्टेंसिबल नहीं है, लेकिन इनहेरिटेंस ऐसे मामलों में कोड का पुन: उपयोग नहीं कर सकता है। रचना का उपयोग करके आप कई वर्गों से कोड का पुन: उपयोग कर सकते हैं क्योंकि उन्हें केवल एक सदस्य चर के रूप में घोषित किया जाता है, लेकिन इनहेरिटेंस के साथ आप कोड फॉर्म का पुन: उपयोग कर सकते हैं क्योंकि जावा में आप केवल एक वर्ग का विस्तार कर सकते हैं, क्योंकि एकाधिक वंशानुक्रम जावा में समर्थित नहीं है। । आप इसे C ++ में कर सकते हैं, क्योंकि एक वर्ग एक से अधिक वर्ग का विस्तार कर सकता है। बीटीडब्ल्यू, आपको हमेशा चाहिएजावा में इनहेरिटेंस पर रचना को प्राथमिकता दें , न केवल मुझे बल्कि यहां तक कि जोशुआ बलोच ने भी अपनी पुस्तक में सुझाव दिया है
मैं इस उदाहरण स्पष्ट रूप से के बीच मतभेदों को बताते हैं लगता है विरासत और रचना ।
इस छूट में, विरासत और संरचना का उपयोग करके समस्या को हल किया जाता है। लेखक इस तथ्य पर ध्यान देता है कि; में विरासत , सुपर क्लास में एक परिवर्तन व्युत्पन्न वर्ग में समस्याएं पैदा कर सकता है, कि यह वारिस।
जब आप विरासत या रचना के लिए यूएमएल का उपयोग करते हैं तो आप प्रतिनिधित्व में अंतर भी देख सकते हैं।
वंशानुक्रम बनाम रचना।
वंशानुक्रम और रचना दोनों का उपयोग वर्ग व्यवहार के पुन: प्रयोज्य और विस्तार के लिए किया जाता है।
मुख्य रूप से IS-A संबंध प्रकार जैसे एक परिवार एल्गोरिथ्म प्रोग्रामिंग मॉडल में उपयोग किए गए इनहेरिटेंस का अर्थ इसी तरह की वस्तु से है। उदाहरण।
ये कार परिवार से हैं।
संरचना एचएएस-ए संबंध टाइप का प्रतिनिधित्व करती है। यह किसी ऑब्जेक्ट की क्षमता को दर्शाता है जैसे डस्टर में फाइव गियर्स, सफारी में चार गियर आदि होते हैं। जब भी हमें किसी मौजूदा वर्ग की क्षमता का विस्तार करने की आवश्यकता होती है तब रचना का उपयोग करें। उदाहरण हमें डस्टर ऑब्जेक्ट में एक और गियर जोड़ने की आवश्यकता है फिर हमें एक और गियर ऑब्जेक्ट बनाना होगा और इसे डस्टर ऑब्जेक्ट पर रचना करना होगा।
हमें आधार वर्ग में तब तक बदलाव नहीं करना चाहिए जब तक कि / जब तक सभी व्युत्पन्न वर्गों को उन कार्यक्षमता की आवश्यकता न हो। इस परिदृश्य के लिए हमें रचना का उपयोग करना चाहिए।
कक्षा बी द्वारा व्युत्पन्न वर्ग ए
कक्षा सी द्वारा व्युत्पन्न कक्षा ए
कक्षा डी द्वारा व्युत्पन्न कक्षा ए।
जब हम कक्षा A में कोई भी कार्यक्षमता जोड़ते हैं, तब यह तब भी सभी उप-वर्गों के लिए उपलब्ध होता है, जब कक्षा C और D को उन कार्यक्षमता की आवश्यकता नहीं होती है। इस परिदृश्य के लिए हमें उन कार्यक्षमता के लिए एक अलग वर्ग बनाने की आवश्यकता है और इसे आवश्यक वर्ग में लिखें ( यहाँ कक्षा बी) है।
नीचे उदाहरण है:
// This is a base class
public abstract class Car
{
//Define prototype
public abstract void color();
public void Gear() {
Console.WriteLine("Car has a four Gear");
}
}
// Here is the use of inheritence
// This Desire class have four gears.
// But we need to add one more gear that is Neutral gear.
public class Desire : Car
{
Neutral obj = null;
public Desire()
{
// Here we are incorporating neutral gear(It is the use of composition).
// Now this class would have five gear.
obj = new Neutral();
obj.NeutralGear();
}
public override void color()
{
Console.WriteLine("This is a white color car");
}
}
// This Safari class have four gears and it is not required the neutral
// gear and hence we don't need to compose here.
public class Safari :Car{
public Safari()
{ }
public override void color()
{
Console.WriteLine("This is a red color car");
}
}
// This class represents the neutral gear and it would be used as a composition.
public class Neutral {
public void NeutralGear() {
Console.WriteLine("This is a Neutral Gear");
}
}
रचना का अर्थ उस वर्ग से वस्तु का निर्माण करना है जिसका उस विशेष वर्ग के साथ संबंध है। मान लीजिए छात्र का खातों से संबंध है;
एक वंशानुक्रम है, यह विस्तारित सुविधा वाला पिछला वर्ग है। इसका मतलब है कि यह नया वर्ग कुछ विस्तारित सुविधा वाला पुराना वर्ग है। मान लीजिए कि छात्र छात्र है, लेकिन सभी छात्र मानव हैं। इसलिए छात्र और मानव का रिश्ता है। यह इनहेरिटेंस है।
नहीं, दोनों अलग हैं। रचना "एचएएस-ए" संबंध का पालन करती है और वंशानुक्रम "आईएस-ए" संबंध का पालन करता है। रचना के लिए सर्वश्रेष्ठ उदाहरण रणनीतिक पैटर्न था।
वंशानुक्रम का अर्थ है किसी वर्ग की पूर्ण कार्यक्षमता का पुन: उपयोग करना, यहाँ मेरी कक्षा को सुपर क्लास के सभी तरीकों का उपयोग करना है और मेरी कक्षा को सुपर क्लास के साथ जोड़ दिया जाएगा और विरासत के मामले में दोनों वर्गों में कोड डुप्लिकेट किया जाएगा।
लेकिन हम इन सभी समस्या से दूर हो सकते हैं जब हम किसी अन्य वर्ग के साथ बात करने के लिए रचना का उपयोग करते हैं। रचना मेरी कक्षा में एक अन्य वर्ग की विशेषता बता रही है जिससे हम बात करना चाहते हैं। और उस विशेषता से हम कौन सी कार्यक्षमता चाहते हैं, हम उस विशेषता का उपयोग करके प्राप्त कर सकते हैं।