Выбор варианта из определенного набора - PullRequest
1 голос
/ 14 июля 2011

Мне было интересно, как лучше всего подойти к следующей проблеме.Скажем, у вас есть класс, который может конвертировать строки в разные языки.

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

Сверху вы видите, что я хочу перевести на итальянский язык, который вложен в европейский тип.Вот пример чего-то, что «работает».

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

Каков наилучший способ сохранить или упорядочить эти параметры?

РЕДАКТИРОВАТЬ: Цель примерабыл плохо описан.Перевод на точный язык будет иметь простое значение, например, int.Мою общую цель можно описать как добавление иерархии в перечисление.Надеемся, что следующий пример поможет лучше описать проблему ... В настоящее время на моей работе мы имеем дело со следующей структурой для записи заметок, относящихся к конкретному человеку, в БД.

    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

Извините за путаницу!

Ответы [ 4 ]

1 голос
/ 14 июля 2011

Поскольку перечисления не поддерживают наследование, я буду использовать классы:

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()
    { }
}
1 голос
/ 14 июля 2011

Не думаю, что вы когда-нибудь захотите создать экземпляр структуры Language. Возьмите StringComparer и Кодировка в качестве примеров и следуйте их прецедентам.

Азиатский может быть другим типом с собственными объектами, расширяющими язык

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 голосов
/ 15 июля 2011

Если ваша иерархия будет иметь только три уровня глубины, как в вашем примере

NoteTypes.CustomerService.ID

Будет ли объявление перечислений в разных пространствах имен (но в одной сборке решить вашу проблему)?

namespace NoteTypes { public enum Client { ID = 1, Name = 2}
public enum CustomerService { ID  = 1, Name = 2}}
0 голосов
/ 14 июля 2011

Независимо от того, является ли структура данных наилучшим или наиболее приемлемым дизайном, вы должны быть последовательными. Если какой-либо из объектов второго уровня требует структуру, тогда вы должны сохранить все объекты 2-го уровня в виде структуры:

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

Тем не менее, я не думаю, что это имеет правильное чувство и может стать очень неприятным. Возможно, вы захотите взглянуть на то, как устроен статический класс Encoding и взять некоторые подсказки из этого. Дело не в том, что вы нарушаете какую-либо практику ООП, создавая экземпляр структуры Language (перечисления являются типами значений), это просто выглядит так, как будто это сложно поддерживать и не очень масштабируемо.

...