यह सवाल काफी भ्रमित है । मुझे देखने दो कि क्या मैं इसे स्पष्ट कर सकता हूं।
जब मैं क्योंकि मुझे लगता है कि विधि एक उपप्रकार IAnInterface
की मैं इस तरह कि विधि लागू करना चाहते हैं का उपयोग कर बनाया है aMethodBeta()
के लिए IGreatInterface
संकलक झंडे एक त्रुटि को लागू करने का प्रयास करें: Object aMethodBeta(AnInterestingClass parameter)
।
यह कानूनी नहीं है। कुछ हद तक सरल बनाना:
class Food {}
class Fruit : Food {}
class Meat : Food {}
interface IEater
{
void Eat(Food food);
}
class Vegetarian : IEater
{
public void Eat(Fruit fruit);
}
कक्षा Vegetarian
IEater
के अनुबंध को पूरा नहीं करता है। आपको किसी भी खाने के लिए भोजन करने में सक्षम होना चाहिए, लेकिन Vegetarian
केवल फल स्वीकार करता है। सी # वर्चुअल विधि औपचारिक पैरामीटर covariance का समर्थन नहीं करता है क्योंकि यह टाइपएफ़ नहीं है।
अब, आप तो कहते हैं, कैसे इस बारे में:
interface IFruitEater
{
void Eat(Fruit fruit);
}
class Omnivore : IFruitEater
{
public void Eat(Food food);
}
अब हम प्रकार सुरक्षा मिल गया है; Omnivore
को IFruitEater
के रूप में उपयोग किया जा सकता है क्योंकि Omnivore
फल, साथ ही साथ कोई अन्य भोजन भी खा सकता है।
दुर्भाग्य से, सी # आभासी विधि औपचारिक पैरामीटर प्रकार contravariance भले ही ऐसा करने से सिद्धांत typesafe में है का समर्थन नहीं करता। कुछ भाषाएं इसका समर्थन करती हैं।
इसी प्रकार, सी # वर्चुअल विधि रिटर्न प्रकार भिन्नता का समर्थन नहीं करता है।
मुझे यकीन नहीं है कि वास्तव में आपके प्रश्न का उत्तर दिया गया है या नहीं। क्या आप इस सवाल को स्पष्ट कर सकते हैं?
अद्यतन:
के बारे में क्या:
interface IEater
{
void Eat<T>(T t) where T : Food;
}
class Vegetarian : IEater
{
// I only want to eat fruit!
public void Eat<Fruit>(Fruit food) { }
}
नहीं, कि नहीं कानूनी या तो है। IEater
का अनुबंध यह है कि आप एक विधि Eat<T>
प्रदान करेंगे जो T
ले सकता है जो Food
है।आप नहीं आंशिक रूप से अनुबंध, किसी भी अधिक की तुलना में आप ऐसा कर सकता है लागू कर सकते हैं:
interface IAdder
{
int Add(int x, int y);
}
class Adder : IAdder
{
// I only know how to add two!
public int Add(2, int y){ ... }
}
लेकिन, आप यह कर सकते हैं:
interface IEater<T> where T : Food
{
void Eat(T t);
}
class Vegetarian : IEater<Fruit>
{
public void Eat(Fruit fruit) { }
}
कि पूरी तरह से कानूनी है। हालांकि, अगर आप ऐसा नहीं कर सकते:
interface IEater<T> where T : Food
{
void Eat(T t);
}
class Omnivore : IEater<Fruit>
{
public void Eat(Food food) { }
}
क्योंकि फिर, सी # आभासी विधि औपचारिक पैरामीटर contravariance या सहप्रसरण का समर्थन नहीं करता।
ध्यान दें कि सी # समर्थन पैरामीट्रिक पोलिमोर्फ़िज्मके सहप्रसरण जब ऐसा करने से typesafe माना जाता है करता है। उदाहरण के लिए, यह कानूनी है:
IEnumerable<Fruit> fruit = whatever;
IEnumerable<Food> food = fruit;
फल का एक अनुक्रम भोजन के एक दृश्य के रूप में इस्तेमाल किया जा सकता है। या,
IEnumerable<Fruit> fruitComparer = whatever;
IComparable<Apples> appleComparer = fruitComparer;
यदि आपके पास ऐसा कुछ है जो किसी भी दो फलों की तुलना कर सकता है तो यह किसी भी दो सेब की तुलना कर सकता है।
हालांकि, इस प्रकार का कॉन्वर्सिस और contravariance केवल कानूनी है जब निम्नलिखित सभी सत्य हैं: (1) भिन्नता प्रकार टाइपफेफ है, (2) प्रकार के लेखक जोड़ा वांछित एनोटेशन वांछित सह- और अनुबंध का संकेत -वृत्त, (3) शामिल विभिन्न प्रकार के तर्क सभी संदर्भ प्रकार हैं, (4) जेनेरिक प्रकार या तो एक प्रतिनिधि या इंटरफ़ेस है।
मुझे आपके प्रश्न को काफी समझ में नहीं आता है। क्या आप कोड पोस्ट कर सकते हैं जो IGreatInterface और विशिष्ट कंपाइलर त्रुटि लागू करता है? – phoog
@ जुआन: बस एक साइड नोट के रूप में यह आपके अपडेट को * अपडेट * या कुछ के साथ चिह्नित करने में मदद करता है ताकि हम देख सकें कि क्या बदला गया है। –