2008-12-08 16 views

उत्तर

16

लघु जवाब: नहीं

थोड़ा लंबा उत्तर: हाँ, आप एक से अधिक इंटरफेस, और एक एकल आधार वर्ग के वारिस हैं। चूंकि यह आमतौर पर एमआई (आप कई इंटरफेस को कार्यान्वित करना चाहते हैं) का कारण है, यह आमतौर पर पर्याप्त है। हालांकि, उन दुर्लभ उदाहरणों में जहां "वास्तविक" एमआई उपयोगी है, .NET आपको ऐसा करने से रोकता है।

+6

एक अंतरफलक विरासत वास्तव में विरासत हालांकि नहीं है ... –

+0

@Orion एडवर्ड्स: यह कैसे नहीं है? विरासत परिभाषित करता है "एक" संबंध है, और इंटरफेस परिभाषित करने का एक तरीका है कि कोई वस्तु 'क्या है'। अगर मैं ISerializable का उत्तराधिकारी हूं, तो मैं कह रहा हूं "मैं एक आईएसरियलज़ेबल हूं", और मुझे उम्मीद के अनुसार एक आईएसरियलज़ेबल काम के रूप में इलाज कर रहा हूं। –

+0

@ हार्पर शेल्बी की टिप्पणी के आगे, इस तरह के प्रतिबंध का एक स्वैच्छिक अनुप्रयोग आमतौर पर सी ++ में सर्वोत्तम अभ्यास के रूप में देखा जाता है (इंटरफेस के बजाय आपके पास शुद्ध सार आधार कक्षाएं होती हैं)। – Richard

4

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

1

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

संरचना के पीछे विचार यह है कि एक इंजन कार नहीं है लेकिन एक कार में एक इंजन है। कार को एक इंजन की जरूरत है, लेकिन यह जानने की जरूरत नहीं है कि एक संपूर्ण इंजन इकाई कैसे काम करती है, बस इसके साथ कैसे इंटरफ़ेस करें। तो इंजन कार से वारिस नहीं होना चाहिए। लेकिन कार को लागू करने वाली कार मूर्खतापूर्ण है। तो कार पूरी कार के सदस्य के रूप में एक इंजन के रूप में, लेकिन एक वस्तु के रूप में एक इंजन हो जाता है। कार की संरचना के हिस्से के रूप में एक इंजन है।

ऐसा लगता है कि आप जो कर रहे हैं वह एक व्यवहार है, जैसे एक बतख वस्तु जिसमें क्वाक व्यवहार होता है, लेकिन रबर बतख बतख होते हैं लेकिन क्विक नहीं करते हैं लेकिन स्क्वाक करते हैं। इसलिए वे मल्लार्ड ऑब्जेक्ट्स से भिन्न होते हैं, लेकिन दोनों में आम तौर पर कई अन्य बतख सुविधाएं होती हैं। तो आप एक क्वाक इंटरफ़ेस रखना चाहते हैं जो प्रत्येक अलग-अलग लागू करता है। लेकिन इस इंटरफ़ेस के लिए कई बतख रैक हो जाएंगे, इसलिए आप प्रत्येक के लिए क्वाक लिखना नहीं चाहते हैं। यही वह जगह है जहां आप क्वाक व्यवहार इंटरफ़ेस को लागू करने के लिए संरचना का उपयोग करते हैं।

1

जहाँ तक मुझे पता के रूप में VB.net सामान्य रूप में एकाधिक वंशानुक्रम का समर्थन नहीं करता, लेकिन आप इंटरफेस के साथ काम (बजाय "विरासत में मिली" के "औजार" का प्रयोग करके) द्वारा एकाधिक वंशानुक्रम का एक प्रकार तक पहुँच सकते हैं:

Public Class ClassName 
    Implements BaseInterface1, BaseInterface2 

End Class 

यह कक्षाओं के लिए ठीक काम करता है लेकिन मैं कुछ बेस इंटरफेस विरासत में एक इंटरफेस रखना चाहता हूं। कुछ ऐसा:

Public Interface InterfaceName 
    Implements BaseInterface1, BaseInterface2 

End Interface 

लेकिन इंटरफ़ेस के लिए "कार्यान्वयन" कीवर्ड की अनुमति नहीं है (निश्चित रूप से क्या समझ में आता है)। मैं सार वर्ग का एक प्रकार है जो मैं जावा से पता का उपयोग करने की कोशिश की:

Public MustInherit Class InterfaceName 
    Implements BaseInterface1, BaseInterface2 

End Class 

लेकिन अब मैं BaseInterface1 और BaseInterface2 से परिभाषित तरीकों InterfaceName वर्ग के भीतर लागू करने के लिए की जरूरत है। लेकिन इंटरफेसनाम एक इंटरफेस होना चाहिए, इसलिए, मैं उस वर्ग के भीतर इन तरीकों को लागू नहीं करना चाहता हूं।

सी # में आप ऐसा कर सकते हैं काफी आसान:

public interface InterfaceName: BaseInterface1, BaseInterface2 {} 
संबंधित मुद्दे