Этот код не работает, но, надеюсь, вы получите то, чего я пытаюсь достичь здесь. У меня есть класс Money, который я взял из http://www.noticeablydifferent.com/CodeSamples/Money.aspx, и немного расширил, чтобы включить конвертацию валют.
Реализация фактического коэффициента конверсии в каждом проекте может быть разной, поэтому я решил переместить фактический метод получения коэффициента конверсии (GetCurrencyConversionRate) в производный класс, но метод ConvertTo содержит код, который будет работать для любой реализации предполагая, что производный класс переопределяет GetCurrencyConversionRate, так что имеет ли смысл хранить его в родительском классе? Поэтому я пытаюсь получить экземпляр SubMoney и иметь возможность вызывать метод .ConvertTo (), который, в свою очередь, использует переопределенный метод GetCurrencyConversionRate и возвращает новый экземпляр SubMoney.
Проблема в том, что я пока не совсем понимаю некоторые концепции полиморфизма и наследования, поэтому не совсем уверен, что то, что я пытаюсь сделать, возможно даже так, как я думаю, потому что в настоящее время происходит то, что Я получаю исключение, где он использовал базовый метод GetCurrencyConversionRate вместо производного. Что-то подсказывает мне, что мне нужно переместить метод ConvertTo вниз к производному классу, но похоже, что я буду дублировать код в нескольких реализациях, так что наверняка есть лучший способ?
public class Money
{
public CurrencyConversionRate
{
get
{
return GetCurrencyConversionRate(_regionInfo.ISOCurrencySymbol);
}
}
public static decimal GetCurrencyConversionRate(string isoCurrencySymbol)
{
throw new Exception("Must override this method if you wish to use it.");
}
public Money ConvertTo(string cultureName)
{
// convert to base USD first by dividing current amount by it's exchange rate.
Money someMoney = this;
decimal conversionRate = this.CurrencyConversionRate;
decimal convertedUSDAmount = Money.Divide(someMoney, conversionRate).Amount;
// now convert to new currency
CultureInfo cultureInfo = new CultureInfo(cultureName);
RegionInfo regionInfo = new RegionInfo(cultureInfo.LCID);
conversionRate = GetCurrencyConversionRate(regionInfo.ISOCurrencySymbol);
decimal convertedAmount = convertedUSDAmount * conversionRate;
Money convertedMoney = new Money(convertedAmount, cultureName);
return convertedMoney;
}
}
public class SubMoney
{
public SubMoney(decimal amount, string cultureName) : base(amount, cultureName) {}
public static new decimal GetCurrencyConversionRate(string isoCurrencySymbol)
{
// This would get the conversion rate from some web or database source
decimal result = new Decimal(2);
return result;
}
}