मैं काफी भ्रमित हूं। मैं हस्ताक्षर नियमों पर ठोकर खाई (बी. लिस्कोव द्वारा उनके काम में भी संदर्भित), कौन सा राज्य:

तर्कों का विरोधाभास। m1 और m2 की संख्या समान है तर्क। अगर m1 के तर्क प्रकारों की सूची a है, और m2 की सूची है b है, तो i । ai <bi // यानी कि a बी.

एक अन्य शिक्षण सामग्री से:

एक फ़ंक्शन प्रकार के लिए DY→CY का उप-प्रकार होना चाहिए (यानी, इसके लिए प्रतिस्थापन योग्य) DX→CX , हमें परिणाम प्रकार में होना चाहिए सहसंयोजक होना चाहिए, लेकिन इसमें विपरीत होना चाहिए तर्क प्रकार!

तो क्या इसका मतलब यह है कि अगर मैं एक ही प्रकार के तर्कों और वापसी प्रकारों का उपयोग करता हूं तो मैं कभी भी उचित उप-टाइपिंग नहीं करता? मुझे समझ में नहीं आता कि एक ही प्रकार का उपयोग करना भी मायने रखता है, यानी जब मैं माता-पिता और बाल वर्ग विधि तर्क दोनों के लिए एक ही प्रकार का उपयोग करता हूं, तो क्या यह विरोधाभासी है?

दूसरे शब्दों में, जैसा कि सी # तर्कों के विपरीत होने की अनुमति नहीं देता है, क्या इसका मतलब यह है कि मेरा कोड कभी भी एलएसपी का अनुपालन नहीं करता है? जैसा कि मैंने पढ़ा है कि एलएसपी के लिए आवश्यक है कि तर्क विरोधाभासी हों।

class Person
{
}
class Employee: Person
{
}

class PersonRegister
{
   GetJobTitle(Employee e) {return e.JobTitle;}
}

class DeriverRegister: PersonRegister
{
  GetJobTitle(Person p)  //contravariance, using less derived type, cannot be done in C#
}

यह कैसे काम कर सकता है अगर उदा। कम व्युत्पन्न प्रकार के लिए आवश्यक फ़ील्ड नहीं है, इस उदाहरण में JobTitle? यह एक कर्मचारी की संपत्ति है लेकिन जरूरी एक व्यक्ति की है।

1
John V 8 अक्टूबर 2018, 00:15

1 उत्तर

सबसे बढ़िया उत्तर
class Person
{
}
class Employee: Person
{
}

class PersonRegister
{
   GetJobTitle(Employee e) {return e.JobTitle;}
}

class DeriverRegister: PersonRegister
{
  GetJobTitle(Person p)  //contravariance, using less derived type, cannot be done in C#
}

ठीक कह रहे हैं आप। यदि आप चाहते हैं कि GetJobTitle में DervierRegister को PersonRegister से GetJobTitle का override माना जाए, तो उसे उसी प्रकार के बिल्कुल का उपयोग करना चाहिए . इस विधि को लिखित रूप में बनाने के लिए आपको अनुमति होनी चाहिए, लेकिन यह PersonRegister से एक को छाया रखती है और इसे ओवरराइड नहीं माना जाता है। तो आप ऊपर लिख सकते हैं, लेकिन

var e = new Employee();
PersonRegister pr = new DervierRegister();
pr.GetJobTitle(e);

PersonRegister से विधि लागू करेगा।

क्या इसका मतलब यह है कि मेरा कोड कभी भी एलएसपी का अनुपालन नहीं करता है?

इस हद तक कि आप सहप्रसरण और विरोधाभास आम तौर पर का उपयोग नहीं कर सकते, हाँ। हालांकि, जेनेरिक इंटरफेस और डेलिगेट्स के लिए, समर्थन सी # 4.0 में जोड़ा गया था। और साथ ही, जैसा कि चर्चा की गई है, औपचारिक रूप से बोलते समय प्रत्येक प्रकार को स्वयं का एक उपप्रकार माना जाता है, इसलिए "a is subtype of a" जैसे वाक्यांश सभी प्रकार के लिए सही होते हैं < एम>ए.

0
Damien_The_Unbeliever 8 अक्टूबर 2018, 15:52