Backstory (Вы можете пропустить)
Я пришел из Qt / C ++, и все еще очень плохо знаком с машинописью и JavaScript.Философия программы, которой я придерживаюсь в Qt / C ++, может быть суммирована как Code everything as an API
, и я пытаюсь узнать, как я могу применить это в машинописи.Я не совсем уверен, что для этого нужно использовать дженерики, поэтому я собираюсь вдаваться в подробности.Если бы это был C ++, я бы, вероятно, использовал шаблон для этого.
В любом случае, я хочу создать класс, который послужит основой для построения интернет-опросов.По сути, идея такова:
- Создать объект класса опроса
let question1 = new Poll(Fruit, "Fav Desert?");
- Конструктор принимает любой тип перечисления в качестве аргумента.
enum Fruit
или enum Vegetable
- Тип enum представляет варианты для вопроса.
Apple, Orange, Banana
- Тип перечисления затем определяет, как будет работать класс.
- Таким образом, если тип перечисления имеет 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
Спасибо.