Написать класс для switch?
Здравствуйте,
Предлагаю сделать так:
abstract class ModelBase : System.Object {
public ModelBase(): base() { }
}
class Model : ModelBase {
public enum ModelType { R33, R34, R35 };
protected ModelType _modelType;
public ModelType getModelType() { return _modelType; }
public Model(ModelType modelType) : base() { _modelType = modelType; }
}
class ModelR33 : Model {
public ModelR33() : base( Model.ModelType.R33 ) { }
}
class ModelR34 : Model
{
public ModelR34() : base(Model.ModelType.R34) { }
}
class ModelR35 : Model
{
public ModelR35() : base(Model.ModelType.R35) { }
}
class Program
{
static void Main(string[] args)
{
ModelR33 mR33 = new ModelR33();
ModelR34 mR34 = new ModelR34();
ModelR35 mR35 = new ModelR35();
Model currentModel = mR34;
switch ( currentModel.getModelType() ) {
case Model.ModelType.R33:
Console.WriteLine("Current Model is R33");
break;
case Model.ModelType.R34:
Console.WriteLine("Current Model is R34");
break;
case Model.ModelType.R35:
Console.WriteLine("Current Model is R35");
break;
}
}
}
Прислушайтесь к советам общественности и пересмотрите дизайн. Если есть необходимость именно так писать - что-то у Вас в коде (или в комманде) не на своем месте.
Успехов!
Murr'у так не надо. Murr'у надо через жопу :)
На самом деле ты просто заменил строковые константы Murr'а на enum :) Ну и зачем-то добавил структуру классов :)
Скорее всего Murr значительно упростил пример. На самом деле классы у него генерируется шаблонами T4 :) Да и switch этот тоже скорее всего генерируется автоматически. Ну а всех этих констант или енумов в сгенерированном описании класса просто нет :) Поэтому признак для переключения у него статические объекты :)
Ну а в шаблоне проще сгенерировать
switch (obj) { case XXX: break; case YYY: break; default: }
чем
if (obj == XXX) { } else if (obj == YYY) { } else { }
Другого объяснения у меня нет :)
что-то у Вас в коде (или в комманде) не на своем месте
-----
Что именно не так?
Возможность определять константы выбранного типа в Шарпе?
А чем именно это плохо? Я вот пока не вижу плохого.
сделать так:
-----
Избыточно и ничего принципиально нового.
То, что меня интересует:
public const ModelR33 r33 = Model.ModelType.R33.
Скорее всего Murr значительно упростил пример.
-----
Да, Я убрал все лишнее - чтобы ничего не мешало понять что именно нужно.
генерируется шаблонами T4
-----
В данном случае - нет.
в шаблоне проще сгенерировать
-----
В шаблоне без разницы что именно выдавать как результат - TModel._R32 или TModel.R32... if() или switch-case...
А вот путаться каждый раз в том что именно использовано - строковая константа или константа типа TModel - совершенно не хочется.
Хочется иметь константу и иметь правила для ее сравнения, отличные от стандартных.
Ох, я с самого начала неправильно понял в чем проблема, извините.
Как сделать то, что вы ищите я не знаю. Удивлюсь, если это окажется невозможным. Я пробывал с определением операторов приведения типов. Не работает так.
public static implicit operator Model( ModelType modelType) { return new Model(modelType); }
public static implicit operator ModelType ( Model model) { return model._modelType; }
В С++, как Вы сами заметили, все решается операторами приведения типов. Сейчас, говорят, можно и литервлы свои создавать (даже приводить не надо: https://en.cppreference.com/w/cpp/language/user_literal)
что-то у Вас в коде (или в комманде) не на своем месте -----
Что именно не так?
Возможность определять константы выбранного типа в Шарпе?
А чем именно это плохо? Я вот пока не вижу плохого.
Думал предложить поллиморфные вызовы, вместо switch. Но теперь понимаю, что проблема совсем не в этом. Недосмотрел.
class ModelR33 : Model{ public ModelR33() : base(Model.ModelType.R33) { }class ModelR34 : Model{ public ModelR34() : base(Model.ModelType.R34) { }