Beynim jöle döndü, ya da bir aklı başında veya başka bir şey yaşadım. Ben görünen bir sınıf hiyerarşisi ile müdahalesi ediyorum böyle biraz:
Operatörler ve devralma
Benim Money
sınıf şuna benzer:
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);
}
}
Benim Dolar operator *
şöyle görünür:
public static Dollar operator *(Dollar multiplicand, int multiplier)
{
var result = multiplicand.Amount * multiplier;
return new Dollar(result);
}
Şimdi, bu test kodunu çalıştırırsam, bir yığın taşması (wahoo!)
{
Money fiveDollars = Money.Dollar(5);
Money timesTwo = fiveDollars*2;
}
Bunun, (Dolar * int) yinelemeli olarak tanımlanmadığı için kesin bir sonuç döndüren alt sınıf (Dolar) operator *
'u tekrar tekrar çağırmasını bekledim. Bu işe yaramadığından, alternatif bir şey yapmam. Bu neden çalışmıyor? Bu davranışı elde etmenin doğru yolu ne olurdu?
Yığın taşması olduğunda, yığını incelemelisiniz. Birbirini tekrar tekrar arayarak aynı işlevleri göreceksiniz. Bu, ne olduğunu ve neden olduğu hakkında çok şey söyleyecektir. – abelenky
Özyinelemenin, Money.operator * ',' Dollar.operator * 'değil çağırdığınız için gerçekleştiğini unutmayın. Operatörler * aşırı yüklenmiş *, * geçersiz kılınmış *, ve çalıştırılan işlev, * çalışma zamanı * türleri değil, işlenenlerin * derleme zamanı * türleri tarafından belirlenir. "BeşDollar", "Para" türünde bir değişken olduğundan, "BeşDollar" * 2 "operatörün * Para" sürümünü çağırır (* çalışma zamanı * beşDollar’ın türü "Dolar'dır" olsa bile) – dlev