2011-07-14 8 views
1

私は次の問題にどのように最善のアプローチがあるのだろうと思っていました。文字列を異なる言語に変換できるクラスがあるとします。特定のセットからオプションを選択する

string MyString = "Hello".Translate(Languages.European.Italian); 

上記のとおり、私が翻訳したい言語は、ヨーロッパタイプのネストされたイタリア語です。ここでは「動く」ものの例です。

 public struct Languages 
     { 
      public struct Asian 
      { 
       public enum Chinese{ Cantonese, Mandarin }; 
      } 
      public enum European { Italian, German };   
     } 

これらのオプションを保存または整理する最良の方法は何ですか?

編集: この例の意図はよく説明されていません。 acutal言語の翻訳はintのような単純な値を持つでしょう。私の全体的な目的は、列挙型に階層を追加するものとして記述することができます。うまくいけば、次の例は、問題をより良く説明するのに役立ちます...現在私の仕事では、特定の人に関するノートをDBに書き込むために以下の構造を扱います。

public struct NoteTypes 
    { 
     public struct Client 
     { 
      public static ID = 1; 
     } 
     public struct CustomerService 
     { 
      public static ID = 2; 
     }  
    } 

WriteToDB(new Note("Hello World", NoteTypes.CustomerService.ID)); 

私はこの方法が奇妙に見えるので、これを行うより良い方法があると考えていました。

この記事では、列挙型に似たものを作成する方法について説明しました。 http://www.codeproject.com/KB/cs/EnhancedEnums.aspx

ご迷惑をおかけして申し訳ありません。

+0

です。あなたは彼らと何をしたいですか? – SLaks

+0

私はこの種のマルチレベル構造を使用しません。なぜなら、実際にあなたの目的のためにそれを必要とせず、最終的には非常にスケーラブルであるからです。 私はすべての言語を1つの静的なクラスに保つか、 'static string Translate(この文字列text、CultureInfo cultureInfo)'のような 'CultureInfo'クラスを使用します。 –

答えて

1

言語構造体をインスタンス化したいとは思わないでしょう。例としてStringComparerEncodingとし、それらの先例に従ってください。

アジアの言語

public abstract class Language 
{ 
    public static readonly AsianLanguage Asian = AsianLanguage.Instance; 
    public static readonly EuropeanLanguage European = EuropeanLanguage.Instance; 
} 
public class AsianLanguage 
{ 
    public static readonly AsianLanguage Instance = new AsianLanguage(); 
    public Language Cantonese {get;private set}; 
    public Language Mandarin {get;private set}; 
    private AsianLanguage(){} 
} 
public class EuropeanLanguage 
{ 
    public static readonly EuropeanLanguage Instance = new EuropeanLanguage(); 
    public Language Italian {get;private set;} 
    public Language German {get;private set;} 
    private EuropeanLanguage(){} 
} 
+0

私はあなたの権利を考える。私はそれを試してみると、病気は受け入れて戻って報告します。 – cgatian

0

を拡張し、独自のオブジェクトと別のタイプの可能性にかかわらず、データ構造が最善か、最も許容できる設計であるかどうかの、あなたは一貫している必要があります。第二レベルのオブジェクトのいずれかが構造体を必要とする場合は、すべての第二のレベルは、構造体オブジェクトおく必要があります言っ

public struct Languages 
{ 
    public struct Asian 
    { 
     public enum Chinese{ Cantonese, Mandarin }; 
    } 
    public struct European 
    { 
     public enum Latin { Italian, Spanish }; 
     public enum Nordic { German }; 
    } 
} 

は、私はこれはそれへの正しい感触を持っていると非常に厄介な得ることができるとは思いません。静的なEncodingクラスがどのように設計されているかを見て、そこからいくつかの手がかりを取りたいと思うかもしれません。言語構造体(enumは値型)をインスタンス化することによって、あらゆる種類のOOPの慣習を破っているわけではありません。これは、保守が難しく、あまりスケーラビリティがないように見えます。

1

列挙型の継承をサポートしていないので、私が代わりにクラスを使用します。

public class Language 
{ 
    public static readonly UnSpecified = new Laguage(); 

    protected Language() 
    { } 
} 

public class Asian : Language 
{ 
    public static readonly Language Cantonese = new Asian(); 
    public static readonly Language Mandarin = new Asian(); 

    protected Asian() : base() 
    { } 
} 

public class European : Language 
{ 
    public static readonly Language Italian = new European(); 
    public static readonly Language German = new European(); 

    protected European() : base() 
    { } 
} 
0

を使用すると、階層ならだけ深い三つのレベルになるだろう、あなたの例のように

NoteTypes.CustomerService.ID 

う異なる名前空間で列挙を宣言します(ただし、同じアセンブリ内で問題を解決します)。

関連する問題