В машинописном тексте я могу иметь член класса, который является типом enum, определяемым конструктором класса, который диктует другие типы членов? - PullRequest
1 голос
/ 26 сентября 2019

Backstory (Вы можете пропустить)

Я пришел из Qt / C ++, и все еще очень плохо знаком с машинописью и JavaScript.Философия программы, которой я придерживаюсь в Qt / C ++, может быть суммирована как Code everything as an API, и я пытаюсь узнать, как я могу применить это в машинописи.Я не совсем уверен, что для этого нужно использовать дженерики, поэтому я собираюсь вдаваться в подробности.Если бы это был C ++, я бы, вероятно, использовал шаблон для этого.

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

  1. Создать объект класса опроса let question1 = new Poll(Fruit, "Fav Desert?");
  2. Конструктор принимает любой тип перечисления в качестве аргумента.enum Fruit или enum Vegetable
  3. Тип enum представляет варианты для вопроса.Apple, Orange, Banana
  4. Тип перечисления затем определяет, как будет работать класс.
  5. Таким образом, если тип перечисления имеет 3 члена, то потребуется 3 ответа, по одному для каждого члена перечисления:
// My stupid internet poll that determines what type of fruit you are
let question1 = new Poll(Fruit, "Favourite Dessert?");
question1.addOption("Banana Split", Fruit.Banana);
question1.addOption("Apple Pie"   , Fruit.Apple );
question1.addOption("Orange Cake" , Fruit.Orange);

let question2 = new Poll(Fruit, "Favourite Colour?");
question2.addOption("Yellow"      , Fruit.Banana);
question2.addOption("Red"         , Fruit.Apple );
question2.addOption("Orange"      , Fruit.Orange);
В базе данных будет отслеживаться популярность каждого члена ответа / перечисления, а также то, как часто участники перечисления выбираются в целом.

В общем, я хочу, чтобы мой класс опроса строился вокруг типа enum, где выполняются внутренние проверки для обеспечения таких вещей, как безопасность типов, количество опций, отсутствие дубликатов и т. Д. *

Актуальный вопрос

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

На мой взгляд, это выглядит примерно так:

class Poll
{
    constructor( T: enum ) // T for enum type
    {
        this.m_T = T; // Pseudo code. Setting enum type used internally
    }
    private type m_T      : enum    ;// Pseudo code, Enum Type
    private m_Options     : m_T   [];// Pseudo code, typesafe array of Enum Type
    private m_OptionsText : string[];// Corresponds with m_Options

    addOption(optionText: string, option: m_T ) : void 
    {
        this.m_Options    .push( option     ); 
        this.m_OptionsText.push( optionText );
    }
}

enum Fruit {
    Apple = 0,
    Orange,
    Banana,
}

enum Vegetable {
    Carrot = 0,
    Broccoli,
    Lettuce,
}

let question1 = new Poll(Fruit, "Favourite Dessert?");
// Typesafe
question1.addOption("Banana Split", Fruit.Banana     ); // Should work
// NOT Typesafe, because question1 was not consructed with Vegetable enum
question1.addOption("Carrot Cake" , Vegetable.Carrot ); // Should NOT work

Спасибо.

...