2013-04-17 8 views
5

चलो कहते हैं कि मैं एक अंतरफलक है कि कई कई अलग वर्गों को लागू करते हैं:वर्कअराउंड

public interface IHaveObjects 
{ 
    object firstObject(); 
} 

(नोट: मैं IHaveObjects का कार्यान्वयन करने वालों के रूप में यह एक सार आधार वर्ग नहीं कर सकते हो सकता है पहले से ही बेस क्लास है।)

अब मैं इंटरफ़ेस में एक नई विधि जोड़ना चाहता हूं, ताकि इंटरफ़ेस के एक कार्यान्वयन के लिए विशेष व्यवहार हो।

public interface IHaveObjects 
{ 
    object firstObject(); 
    object firstObjectOrFallback() 
    { 
     return firstObject(); 
    } 
} 

तो इंटरफ़ेस की है कि एक implementor के पास जाकर यह ओवरराइड दे:: आदर्श रूप में मैं कुछ इस तरह करना होगा

public class ObjectHaverPlus : IHaveObjects 
{ 
    public override object IHaveObjects.firstObjectOrFallback() 
    { 
     return firstObject() ?? getDefault(); 
    } 
} 

लेकिन यह सी # में मना रहा है एक में एक विधि शरीर प्रदान करने के लिए इंटरफ़ेस, और firstObjectOrFallback() की परिभाषा में ड्रॉप करने के लिए मैं IHaveObjects के प्रत्येक एकल कार्यान्वयनकर्ता से जाने से बचना चाहता हूं। (कल्पना करें कि सैकड़ों या हजारों हैं)

क्या बहुत सारे कॉपी पेस्ट के बिना ऐसा करने का कोई तरीका है?

+1

उस विशेष मामले के लिए दूसरा इंटरफ़ेस क्यों न बनाएं? आपके पास कक्षाओं की एकाधिक विरासत नहीं हो सकती है, लेकिन आप कई इंटरफेस को कार्यान्वित कर सकते हैं। – Tim

उत्तर

2

IHaveObjects से प्राप्त होने वाले दूसरे इंटरफ़ेस को शुरू करने के बारे में कैसे।

आपको केवल इन वर्गों को बदलना होगा, जिन्हें नई विधि के साथ नए इंटरफेस की आवश्यकता है।

इस तरह दिखता है:

interface I1 
    { 
     void Method1(); 
    } 

    interface I2 : I1 
    { 
     void Method2(); 
    } 
+0

ओह ... मुझे यह पसंद है ... मेरे जवाब में विरासत के बारे में भी नहीं सोचा था। मुझे मूर्खतापूर्ण :) – Tim

+0

हाँ, लेकिन यह सी # में संभव नहीं है। मैंने उसे एक वैकल्पिक तरीका दिया। – Tomtom

+0

@ टॉमटॉम मुझे लगता है कि मैं यही करना चाहता हूं। इसका अर्थ यह है कि ऑब्जेक्ट विस्तारित इंटरफ़ेस का है या नहीं, लेकिन यह ठीक होना चाहिए।धन्यवाद – Patashu

1

मैं आपके सवाल का गलत समझा हो सकता है, लेकिन क्यों एक दूसरे इंटरफ़ेस का उपयोग नहीं है, कुछ की तरह:

public interface IHaveObjectsEnhanced 
{ 

    object FirstObjectOrFallback(); 
} 

तो फिर तुम पहले और दूसरे इंटरफ़ेस को लागू कर सकते हैं:

public class ObjectHaverPlus : IHaveObjects, IHaveObjectsEnhanced 
{ 

    public object FirstObject() 
    { 

    } 

    public object FirstObjectOrFallback() 
    { 
     return FirstObject() ?? GetDefault(); 
    } 

} 
2

इंटरफेस के साथ यह समस्या है - उनके पास कोई डिफ़ॉल्ट कार्यान्वयन नहीं है इसलिए उन में परिवर्तन परिवर्तन तोड़ रहे हैं - यानी इंटरफ़ेस के नए संस्करण के साथ काम करने के लिए कोड को संशोधित करने की आवश्यकता है।

चूंकि आपके कार्यान्वयन में पहले से ही बेस क्लास हैं - आप इसे अमूर्त वर्ग में नहीं बदल सकते हैं, न ही C# में एकाधिक वर्ग विरासत है।

आप क्या कर सकते हैं सोचने के लिए है - क्या यह वास्तव में इंटरफेस पर एक तरीका है? या इसे इंटरफेस पर extension method के रूप में कार्यान्वित किया जा सकता है (कोशिश नहीं की लेकिन मुझे लगता है कि यह ठीक काम करेगा)?

यदि यह इंटरफेस पर एक विधि है और यह वहाँ रहना चाहिए - आप को दो भागों में इस इंटरफेस को तोड़ने, दूसरी पहले (IHaveObjectsAndSupportDefault : IHaveObjects) से इनहेरिट के बारे में सोच सकते हैं और कुछ अन्य की तरह इस इंटरफेस जहां डिफ़ॉल्ट मान वास्तव में जरूरत है (का उपयोग जवाब इंगित करते हैं)।

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