2010-03-03 20 views
8

वैसे मैं पूछने जा रहा था कि अंतर क्या है लेकिन इसका उत्तर पहले दिया गया है। लेकिन अब मैं पूछ रहा हूं कि उन्होंने इन मतभेदों को क्यों बनाया? (मैं यहां जावा के बारे में बात कर रहा हूं, मुझे नहीं पता कि यह अन्य भाषाओं पर लागू होता है)सार कक्षाएं और इंटरफेस क्यों बनाते हैं?

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

क्या कोई विधि शरीर लिखने में सक्षम नहीं है, या कई बार विस्तारित करने में कोई फायदा नहीं है जिसे मैं नहीं देख रहा हूं?

उत्तर

10

क्योंकि कक्षाओं को एक ही विधि हस्ताक्षर के लिए कई कार्यान्वयन प्राप्त करने की अनुमति देने के कारण स्पष्ट प्रश्न होता है, जिसे रनटाइम पर उपयोग किया जाना चाहिए।

जावा केवल इंटरफ़ेस के लिए एकाधिक विरासत का समर्थन करके इसे से बचाता है। प्रत्येक इंटरफ़ेस में घोषित हस्ताक्षरों को अधिक आसानी से जोड़ा जा सकता है (जावा मूल रूप से सभी विधियों के संघ का उपयोग करता है)

+0

आह, मुझे पता था कि मुझे कुछ याद आना चाहिए, यह समझ में आता है! – Paul

3

एकाधिक विरासत को एक भाषा (वास्तव में संकलक) में लागू करना अधिक कठिन होता है क्योंकि इससे कुछ मुद्दों का कारण बन सकता है। इन मुद्दों पर पहले चर्चा की गई है: What is the exact problem with multiple inheritance

मैंने हमेशा यह माना है कि यह जावा में एक समझौता था। इंटरफेस एक वर्ग को एकाधिक विरासत के सिरदर्द के बिना कई अनुबंधों को पूरा करने की अनुमति देता है।

0

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

+0

सी ++ में मिश्रण नहीं हैं क्योंकि मैं उन्हें समझता हूं। मिक्सिन्स को रनटाइम पर कक्षा में जोड़ा जा सकता है ("इस डीबीआई इंस्टेंस में लॉगर व्यवहार जोड़ें"), जो सी ++ भाषा का मुख्य भाग नहीं है। –

+0

@ फिलिप मुझे नहीं पता कि आपका क्या मतलब है। मिक्सिन का अक्सर सी ++ में उपयोग किया जाता है, शायद ग्रेडी बूच की किताबों में सबसे प्रसिद्ध है। –

+0

मुझे लगता है कि हम तब "mixin" की परिभाषा पर असहमत हैं। कोई बड़ा सौदा नहीं, साथ चलें। –

5

सी ++ में एकाधिक विरासत diamond inheritance problem जैसी अर्थपूर्ण अस्पष्टताओं की ओर ले जाती है। एमआई काफी शक्तिशाली है, लेकिन जटिल परिणाम हैं।

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

1

उन्हें एक चीज बनाना वह मार्ग है जो स्कैला लोगों ने ट्रेट्स के साथ लिया जो एक इंटरफेस है जिसमें कई विरासत हो सकते हैं और कई विरासत का समर्थन कर सकते हैं।

मुझे लगता है कि इंटरफेस, मेरे लिए, साफ हैं कि वे केवल आवश्यकताओं (अनुबंध द्वारा डिजाइन) निर्दिष्ट करते हैं जबकि अमूर्त वर्ग सामान्य व्यवहार (कार्यान्वयन) को परिभाषित करते हैं, इसलिए एक अलग नौकरी के लिए एक अलग उपकरण? इंटरफेस शायद संकलन समय के दौरान भी अधिक कुशल कोड पीढ़ी की अनुमति देता है?

0

विरासत आप, प्रकृति माता पिता वर्ग के (अर्थ) और जिम्मेदारी (व्यवहार) के वारिस इंटरफेस कार्यान्वयन का मतलब है जब आप एक अनुबंध को पूरा (जैसे Serializable) है, जो मूल प्रकृति के साथ कुछ नहीं हो सकता है इसका मतलब है या कक्षा की ज़िम्मेदारी।

सार कक्षा आपको एक प्रकृति को परिभाषित करने देती है जिसे आप सामान्य होना चाहते हैं और सीधे अस्थिर नहीं होना चाहिए, क्योंकि यह विशिष्ट होना चाहिए। आप जानते हैं कि कुछ उच्च स्तरीय कार्यों को कैसे करें (उदाहरण के लिए कुछ पैरामीटर के अनुसार निर्णय लें), लेकिन आप कुछ निम्न-स्तरीय कार्रवाइयों (जैसे कुछ मध्यस्थ पैरामीटर की गणना) के विवरणों को नहीं जानते हैं, क्योंकि यह कार्यान्वयन विकल्पों पर निर्भर करता है।इस समस्या को हल करने का एक विकल्प Strategy design pattern है। यह अधिक लचीला है, रन-टाइम रणनीति स्विचिंग और शून्य व्यवहार की अनुमति देता है, फिर भी यह अधिक जटिल है (और रनटाइम स्विटिचिंग हमेशा आवश्यक नहीं है)। इसके अलावा, आप का अर्थ खो सकते हैं & टाइपिंग सुविधाएं (पॉलिमॉर्फिज्म & टाइप-चेकिंग थोड़ा कठिन हो जाती है क्योंकि रणनीति एक घटक है, ऑब्जेक्ट स्वयं नहीं)।

सार वर्ग = है-एक, रणनीति = है-एक

संपादित करें: एकाधिक वंशानुक्रम के लिए के रूप में, पुन्तुस Gagge के जवाब देखें।

2

इस उदाहरण पर विचार:

public abstract class Engine 
{ 
    public abstract void switchPowerOn(); 
    public abstract void sprinkleSomeFuel(); 
    public abstract void ignite(); 

    public final void start() 
    { 
    switchPowerOn(); 
    sprinkleSomeFuel(); 
    ignite(); 
    } 
} 

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

उस पैटर्न को "फॉर्म टेम्पलेट विधि" कहा जाता है और यह मेरे लिए जावा में अमूर्त कक्षाओं का एकमात्र समझदार उपयोग है।

संबंधित मुद्दे