これらの2つのクラスをどのようにリファクタリングして類似性を抽象化しますか?抽象クラスですか?単純な継承?リファクタリングされたクラスはどのように見えますか?この場合には、私見より複雑であると思われるものを因数分解 - 彼らがあるとして、私はおそらくそれらを残して、より多くのをどうするつもりされていない場合2つの基本クラスをリファクタリングする
public class LanguageCode
{
/// <summary>
/// Get the lowercase two-character ISO 639-1 language code.
/// </summary>
public readonly string Value;
public LanguageCode(string language)
{
this.Value = new CultureInfo(language).TwoLetterISOLanguageName;
}
public static LanguageCode TryParse(string language)
{
if (language == null)
{
return null;
}
if (language.Length > 2)
{
language = language.Substring(0, 2);
}
try
{
return new LanguageCode(language);
}
catch (ArgumentException)
{
return null;
}
}
}
public class RegionCode
{
/// <summary>
/// Get the uppercase two-character ISO 3166 region/country code.
/// </summary>
public readonly string Value;
public RegionCode(string region)
{
this.Value = new RegionInfo(region).TwoLetterISORegionName;
}
public static RegionCode TryParse(string region)
{
if (region == null)
{
return null;
}
if (region.Length > 2)
{
region = region.Substring(0, 2);
}
try
{
return new RegionCode(region);
}
catch (ArgumentException)
{
return null;
}
}
}
残念ながら、TryParseメソッドが静的でないため、残念ながらうまく機能しません。 TryParseは、新しいLanguageCodeまたはRegionCodeオブジェクトを返すファクトリメソッドには有効です。あなたの例では、最初にオブジェクトを作成する必要があります。 TryParseは静的であるため、ベースTryParseをオーバーライドすることはできません。 –
残念ながら、TwoLetterCodeの新しいインスタンスは抽象的であるため作成できません(return new TwoLetterCode(tlc)を参照)。私はTwoLetterCodeのクラスのdelcarationから "抽象"を取り除くことができますが、保護されている型だけでTwoLetterCodeを作成できるようにする必要はありません。 – core