मेरा दिमाग जेली हो गया है, या मेरे पास दिमागी अनुभव, या कुछ से बाहर है। मैं एक वर्ग पदानुक्रम है कि लग रहा है को संवारता कर रहा हूँ इस तरह एक सा:
ऑपरेटर और विरासत
मेरे Money
वर्ग इस तरह दिखता है:
public abstract class Money
{
public int Amount { get; set; }
public static bool operator ==(Money leftSide, Money rightSide)
{
// Money can only be equal if it is in the same currency.
if (leftSide.GetType() != rightSide.GetType()) return false;
return leftSide.Amount == rightSide.Amount;
}
public static bool operator !=(Money leftSide, Money rightSide)
{
// If the currencies are different, the amounts are always considered unequal.
if (leftSide.GetType() != rightSide.GetType()) return true;
return leftSide.Amount != rightSide.Amount;
}
public static Money operator *(Money multiplicand, int multiplier)
{
var result = multiplicand * multiplier;
return result;
}
public static Dollar Dollar(int amount)
{
return new Dollar(amount);
}
public static Franc Franc(int amount)
{
return new Franc(amount);
}
}
मेरे डॉलर operator *
इस तरह दिखता है:
public static Dollar operator *(Dollar multiplicand, int multiplier)
{
var result = multiplicand.Amount * multiplier;
return new Dollar(result);
}
अब, अगर मैं यह टेस्ट कोड चलाता हूं, तो मुझे स्टैक ओवरफ़्लो मिलता है (वाहू!)
{
Money fiveDollars = Money.Dollar(5);
Money timesTwo = fiveDollars*2;
}
मुझे उम्मीद थी कि यह फिर से उप-वर्ग (डॉलर) operator *
पर कॉल करेगा, जो एक निश्चित परिणाम लौटाएगा क्योंकि (डॉलर * int) को गैर-पुनरावर्ती रूप से परिभाषित किया गया है। चूंकि यह काम नहीं करता है, वैकल्पिक यह है कि मैंने कुछ गूंगा किया है। यह क्यों काम नहीं करता है? इस व्यवहार को पाने का सही तरीका क्या होगा?
जब आपको स्टैक ओवरफ़्लो मिलता है, तो आपको स्टैक की जांच करनी चाहिए। आप एक ही काम को एक-दूसरे को बार-बार बुलाएंगे। वह अकेला आपको बताएगा कि क्या हो रहा है और क्यों। – abelenky
ध्यान दें कि रिकर्सन होता है क्योंकि आप वास्तव में 'मनीऑपरेटर *' का आह्वान कर रहे हैं, न कि 'डॉलर। ऑपरेटर *'। ऑपरेटर * अधिभारित *, * ओवरराइड * नहीं होते हैं, और इसलिए जो कार्यवाही की जाती है उसे * संकलन-समय * ऑपरेंड के प्रकारों द्वारा निर्धारित किया जाता है, न कि * रन-टाइम * प्रकार। चूंकि 'पांच डोलर्स 'प्रकार' मनी 'का एक चर है,' पांच डोलर्स * 2' 'ऑपरेटर *' के 'मनी' संस्करण को आमंत्रित करता है (भले ही * रन-टाइम *' पांच डोलर्स 'प्रकार 'डॉलर' है।) – dlev