这段代码不起作用,但希望你能在这里得到我想要实现的目标。我有一个 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;
}
}