कब लागू करें और बढ़ाएं? [बन्द है]


90
  • कब implementया extendइस्तेमाल किया जाना चाहिए ?
  • कुछ वास्तविक दुनिया के उदाहरण क्या हैं?

क्या ये सही है?

लागू करना एक तरीका है जिससे यह सुनिश्चित किया जा सकता है कि कुछ विधियाँ एक वर्ग में मौजूद हैं, और यह कि ये फ़ंक्शन फ़ंक्शन कॉल ठीक से स्वरूपित हैं। लागू करने के लिए कक्षा में चर या "सेटिंग" पारित करने का एक तरीका नहीं है?

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

विस्तार वर्गों बनाता बढ़ाया (बच्चे?) के रूप में घोषित अपनी मूल कक्षा से दूसरी कक्षा इनहेरिट सब कुछ तरीकों और चर को छोड़कर private?

उम्मीद की वास्तविक जीवन परिदृश्य: मैं एक वर्ग कहा जाता है sessionsनाम के दो बच्चे वर्गों के साथ sessioncookiesऔर databasesessionssessioncookiesऔर databasesessions, एक साथ कई मूल विन्यास विकल्पों को उनके मूल सत्रों से विरासत में मिलाते हैं, जिससे सभी प्रकार के अंतिम आगंतुक डेटा भंडारण को प्रभावित करने के लिए एक विन्यास विकल्प को बदलना आसान हो जाता है।


1
मैं आपको विरासत पर पढ़ने की सलाह देता हूं।
राफे केटलर 19

जवाबों:


64

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

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

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

वंशानुक्रम OOP में एक बड़ी अवधारणा है जो कि केवल PHP से आगे जाती है। मेरा सुझाव है कि आप गैंग ऑफ फोर द्वारा विरासत और शायद डिज़ाइन पैटर्न पर विकिपीडिया लेख पढ़ें ।

मेरा मानना ​​है कि विरासत की आपकी समझ मुख्य रूप से सही है। अगला कदम उत्पादन में इसका उपयोग करना होगा।


4
बहुत से लोग अब डिजाइन पैटर्न के परिचय के रूप में सामग्री के मामले में गैंग ऑफ फोर बुक को बहुत भारी मानते हैं। एक लोकप्रिय विकल्प है हेड फर्स्ट: डिज़ाइन पैटर्न जो लाइटर रीडिंग के लिए बनाता है। amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan

1
"उन मामलों की तलाश में रहें जहां आप कई वर्गों में समान विधियों को परिभाषित करते हैं; वे उत्कृष्ट मामले हैं जहां आप उन विधियों को आधार वर्ग में बदल सकते हैं।" उन तरीकों को परिभाषित करने के लिए एक विशेषता का उपयोग करते हुए एक वर्ग का विस्तार करना एक लाभ होगा?
डैनियल वेनर

1
"इनहेरिटेंस आपके द्वारा लिखे गए कोड की मात्रा को कम करने के लिए उपयोगी है" - उत्तराधिकार का उद्देश्य व्यवहार को साझा करना है, कोड को नहीं। जहाँ संभव हो, लक्षण ठोस वर्गों के साथ एक अमूर्त वर्ग का विस्तार करने के बजाय कोड साझा करने का तरीका है जो अन्यथा आम कुछ भी नहीं है। आप आमतौर पर अपनी कक्षाओं को मॉडल कर सकते हैं जैसे-बल्कि एक-एक संबंध भी है, जो कोड पुन: प्रयोज्य और बहुरूपता दोनों को सुविधाजनक बनाएगा।
डंकन

12

लागू:

इंटरफेस अमूर्त वर्ग हैं, इसलिए आप केवल चीजों की घोषणा कर सकते हैं। एक वर्ग एक इंटरफ़ेस लागू करता है। आप कई इंटरफेस लागू कर सकते हैं ।

बढ़ाएँ:

आप विस्तार कक्षाओं जब आप एक चाहते हैं और अधिक विशिष्ट संस्करण एक वर्ग के।

उदाहरण:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat();
    public void sleep();
}


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

कैमल और डॉग दोनों ही जानवर हैं, इसलिए वे Animalक्लास का विस्तार करते हैं । लेकिन केवल डॉग एक विशिष्ट प्रकार का है Animalजो एक भी हो सकता हैPet

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.