このコードは機能しませんが、ここで達成しようとしていることが理解できることを願っています。http://www.noticeablydifferent.com/CodeSamples/Money.aspxから取得した Money クラスを取得し、通貨変換を含めるために少し拡張しました。
実際のコンバージョン率の実装はプロジェクトごとに異なる可能性があるため、コンバージョン率を取得するための実際のメソッド (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;
}
}