यदि हमारे पास एक वर्ग है जो एकाधिक इंटरफेस से विरासत में है, और इंटरफेस के समान नाम के साथ विधियां हैं, तो हम इन वर्गों को अपनी कक्षा में कैसे कार्यान्वित कर सकते हैं? हम कैसे निर्दिष्ट कर सकते हैं कि किस इंटरफ़ेस को कार्यान्वित किया गया है?एक ही विधि नाम के साथ कई इंटरफेस से विरासत
उत्तर
स्पष्ट इंटरफेस को लागू करने, इस तरह द्वारा:
public interface ITest {
void Test();
}
public interface ITest2 {
void Test();
}
public class Dual : ITest, ITest2
{
void ITest.Test() {
Console.WriteLine("ITest.Test");
}
void ITest2.Test() {
Console.WriteLine("ITest2.Test");
}
}
का उपयोग करते समय स्पष्ट इंटरफ़ेस कार्यान्वयन, कार्य कक्षा पर सार्वजनिक नहीं हैं। इसलिए इन कार्यों तक पहुंचने के लिए, आपको पहले ऑब्जेक्ट को इंटरफ़ेस प्रकार पर डालना होगा, या इंटरफ़ेस प्रकार के घोषित वैरिएबल को असाइन करना होगा।
var dual = new Dual();
// Call the ITest.Test() function by first assigning to an explicitly typed variable
ITest test = dual;
test.Test();
// Call the ITest2.Test() function by using a type cast.
((ITest2)dual).Test();
आप का उपयोग explicit interface implementation
आप एक या उन इंटरफेस explicitly के दोनों लागू कर सकते हैं चाहिए।
कहो आप इन इंटरफेस है:
public interface IFoo1
{
void DoStuff();
}
public interface IFoo2
{
void DoStuff();
}
आप इस तरह दोनों को लागू कर सकते हैं:
public class Foo : IFoo1, IFoo2
{
void IFoo1.DoStuff() { }
void IFoo2.DoStuff() { }
}
कभी कभी तुम भी क्या करने की जरूरत हो सकता है:
public class Foo : IFoo1, IFoo2
{
public void IFoo1.DoStuff() { }
public void IFoo2.DoStuff()
{
((IFoo1)this).DoStuff();
}
}
बनाम सही इंटरफ़ेस प्रकार का अस्थायी बना रहा है? जी नहीं, धन्यवाद। 'readonly IFoo1 यह 1 = यह; this1।DoStuff(); ' –
विरासत कक्षाएं जिनमें स्पष्ट इंटरफ़ेस कार्यान्वयन में कोड शामिल है अक्सर व्युत्पन्न कक्षाओं के लिए परेशानी का कारण बनता है। मैं एक इंटरफ़ेस सदस्यों के लिए कोड के साथ 'संरक्षित' विधि वाले वैकल्पिक पैटर्न के रूप में सुझाव दूंगा, और दोनों इंटरफ़ेस सदस्यों को उस श्रृंखला को लेकर होगा। एक सदस्य का उपयोग करने के उद्देश्य से 'इस' को एक इंटरफेस प्रकार में कास्टिंग करना आम तौर पर एक महत्वपूर्ण कोड गंध है। एक 'संरक्षित' विधि के लिए बेहतर है जो सदस्य को प्रश्न और श्रृंखला में लागू करता है। – supercat
public class ImplementingClass : AClass1, IClass1, IClass2
{
public override string Method()
{
return "AClass1";
}
string IClass1.Method()
{
return "IClass1";
}
string IClass2.Method()
{
return "IClass2";
}
}
तो जब विभिन्न वर्ग से कॉल करते समय आवश्यक इंटरफ़ेस या अमूर्त वर्ग में वस्तु डाली टाइप करने के लिए होगा।
ImplementingClass implementingClass = new ImplementingClass();
((AClass1)implementingClass).Method();
public interface IDemo1
{
void Test();
}
public interface IDemo2
{
void Test();
}
public class clsDerived:IDemo1,IDemo2
{
void IDemo1.Test()
{
Console.WriteLine("IDemo1 Test is fine");
}
void IDemo2.Test()
{
Console.WriteLine("IDemo2 Test is fine");
}
}
public void get_methodes()
{
IDemo1 obj1 = new clsDerived();
IDemo2 obj2 = new clsDerived();
obj1.Test();//Methode of 1st Interface
obj2.Test();//Methode of 2st Interface
}
आप एक इंटरफ़ेस को लागू कर सकते हैं स्पष्ट रूप से और एक और implecitely।
public interface ITest {
void Test();
}
public interface ITest2 {
void Test();
}
public class Dual : ITest, ITest2
{
public void Test() {
Console.WriteLine("ITest.Test");
}
void ITest2.Test() {
Console.WriteLine("ITest2.Test");
}
}
ITest.Test
डिफ़ॉल्ट कार्यान्वयन किया जाएगा।
Dual dual = new Dual();
dual.Test();
((ITest2)dual).Test();
आउटपुट:
Console.WriteLine("ITest.Test");
Console.WriteLine("ITest2.Test");
- 1. दो इंटरफेस एक ही विधि का नाम
- 2. सी ++ इंटरफ़ेस एक ही विधि के साथ एकाधिक विरासत
- 3. एक ही नाम विधि
- 4. एक ही विधि नाम के साथ विभिन्न पथों से पायथन एकाधिक विरासत
- 5. IDISposable के साथ इंटरफेस विरासत?
- 6. सी ++: विरासत ओवरलोडेड गैर वर्चुअल विधि और वर्चुअल विधि दोनों एक ही नाम के साथ समस्या का कारण बनती है
- 7. जावा संग्रह इंटरफेस में विरासत
- 8. पिलोन में एक यूआरएल से एक ही नाम के साथ कई पैरामीटर कैसे प्राप्त करें?
- 9. कई इंटरफेस
- 10. जावा इंटरफेस और विरासत
- 11. विधि और चर नाम एक ही
- 12. एक डब्ल्यूसीएफ सेवा से कई इंटरफेस?
- 13. विभिन्न जारों से एक ही नाम के साथ कई संसाधन फ़ाइलों को कैसे पढ़ा जाए?
- 14. एक ही नाम के साथ स्टेटिक और इंस्टेंस विधियां?
- 15. एक इंटरफेस के साथ बातचीत?
- 16. कई इंटरफेस (लिनक्स) के साथ एक सर्वर पर मल्टीकास्ट प्राप्त
- 17. एक ही घोषणा के साथ एक वैश्विक विधि को एक ही घोषणा के साथ कॉल करना
- 18. एक ही @XmlRootElement नाम
- 19. एक पैरामीटर के लिए कई इंटरफेस निर्दिष्ट
- 20. जावा इंटरफेस विरासत और विस्तार
- 21. वर्चुअल विधियों के साथ एक इंटरफ़ेस होने के बाद? या केवल 1 वर्चुअल विधि के साथ कई इंटरफेस हैं?
- 22. जावा जर्सी बाकी सेवा करने के लिए एक ही नाम के साथ कई FormDataParams पोस्ट करना
- 23. एक ही प्रकृति के कई क्षेत्रों के साथ ल्यूसीन इंडेक्स
- 24. क्या यह एक ही नाम के साथ कई HTML रूपों के लिए ठीक है?
- 25. विरासत कंक्रीट कक्षाओं के साथ सी ++ में इंटरफेस लागू करना
- 26. सी ++ कंपाइलर विरासत में सार्वजनिक और विरासत वाली निजी विधि के बीच एक ही नाम के साथ असंबद्ध क्यों नहीं होगा?
- 27. एक ही विधि नाम के साथ एकाधिक डीएलएल आयातों को कॉल करना
- 28. एक ही नाम के साथ दो सामान्य तरीकों
- 29. ग्रहण: एक ही नाम के साथ कई परियोजनाएं लेकिन अलग-अलग स्थान
- 30. डब्ल्यूसीएफ और इंटरफेस विरासत - क्या यह एक भयानक बात है?
क्या हुआ अगर टेस्ट() दोनों इंटरफेस और दोहरी कक्षा में सार्वजनिक घोषित किया जाता है? –
इंटरफेस पर तरीके/गुण हमेशा सार्वजनिक होते हैं - यह एक इंटरफेस का पूरा बिंदु है। लेकिन जब आप _explicit इंटरफ़ेस कार्यान्वयन_ का उपयोग करते हैं, तो फ़ंक्शन हमेशा कक्षा पर निजी होगा। यही कारण है कि आपको कक्षा को उस विशिष्ट इंटरफ़ेस में डालने की तकनीक की आवश्यकता है जिसकी आपको आवश्यकता है। जब आप दो इंटरफेस को कार्यान्वित करते हैं जो समान हस्ताक्षर वाले विधियों को परिभाषित करते हैं, तो आप इससे बच नहीं सकते हैं। – Pete
ध्यान दें कि इसका एक और सूक्ष्म "फीचर" यह है कि प्रत्येक विधि में एक अलग वापसी प्रकार हो सकता है भले ही उनके पास एक ही विधि हस्ताक्षर हो। यदि आप सभी या सभी तरीकों पर स्पष्ट इंटरफ़ेस घोषणा का उपयोग नहीं करते हैं, तो इसे सामान्य रूप से अनुमति नहीं दी जाती है। – NightOwl888