Não của tôi đã chuyển sang dạng thạch, hoặc tôi đang có một trải nghiệm ngoài ý muốn hoặc thứ gì đó. Tôi đang mày mò với một hệ thống phân cấp lớp đó trông hơi như thế này:
Các nhà khai thác và thừa kế
lớp Money
của tôi trông như thế này:
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);
}
}
Dollar My operator *
trông như thế này:
public static Dollar operator *(Dollar multiplicand, int multiplier)
{
var result = multiplicand.Amount * multiplier;
return new Dollar(result);
}
Bây giờ, nếu tôi chạy mã kiểm tra này, tôi sẽ nhận được tràn ngăn xếp (wahoo!)
{
Money fiveDollars = Money.Dollar(5);
Money timesTwo = fiveDollars*2;
}
Tôi đã dự kiến rằng điều này sẽ đệ quy gọi lớp con (Dollar) operator *
, sẽ trả về kết quả xác định vì (Dollar * int) được xác định không đệ quy. Vì điều này không hiệu quả, cách khác là tôi đã làm điều gì đó ngu ngốc. Tại sao nó không hoạt động? Điều gì sẽ là đúng cách để có được hành vi này?
Khi bạn bị tràn ngăn xếp, bạn nên kiểm tra ngăn xếp. Bạn sẽ thấy các chức năng tương tự gọi cho nhau nhiều lần. Điều đó một mình sẽ cho bạn biết rất nhiều về những gì đang xảy ra và tại sao. – abelenky
Lưu ý rằng đệ quy xảy ra bởi vì bạn đang thực sự gọi 'Money.operator *', không phải 'Dollar.operator *'. Các toán tử * bị quá tải *, không * ghi đè *, và do đó hàm được gọi được xác định bởi các kiểu * thời gian biên dịch * của các toán hạng, không phải kiểu * thời gian chạy *. Vì 'nămDollars' là một biến kiểu' Money', 'nămDollars * 2' gọi' phiên bản 'tiền' của toán tử * '(mặc dù kiểu * thời gian chạy * của' nămDollars' là 'Dollar'.) – dlev