Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

​Написать класс для switch?

570  1 2 все
Murr патриот11.01.19 12:12
Murr
NEW 11.01.19 12:12 
в ответ Murr 11.01.19 10:11

А все же билли ну такой, бля, мудень...

Да, public struct Int32 - определена... но не используется...

Как сказать что моя структура должна быть синонимом Инт32 нигде не описано...


Бяка...

#21 
hbrenner прохожий11.01.19 15:37
hbrenner
NEW 11.01.19 15:37 
в ответ Murr 09.01.19 13:28

Здравствуйте,


Предлагаю сделать так:


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;
        }
    }
}


Прислушайтесь к советам общественности и пересмотрите дизайн. Если есть необходимость именно так писать - что-то у Вас в коде (или в комманде) не на своем месте.


Успехов!

#22 
Программист коренной житель11.01.19 16:41
NEW 11.01.19 16:41 
в ответ hbrenner 11.01.19 15:37

Murr'у так не надо. Murr'у надо через жопу :)


На самом деле ты просто заменил строковые константы Murr'а на enum :) Ну и зачем-то добавил структуру классов :)


Скорее всего Murr значительно упростил пример. На самом деле классы у него генерируется шаблонами T4 :) Да и switch этот тоже скорее всего генерируется автоматически. Ну а всех этих констант или енумов в сгенерированном описании класса просто нет :) Поэтому признак для переключения у него статические объекты :)

Ну а в шаблоне проще сгенерировать

switch (obj)
{
case XXX:
   break;
case YYY:
   break;
default:
}

чем

if (obj == XXX)
{
}
else if (obj == YYY)
{
}
else
{
}

Другого объяснения у меня нет :)

#23 
Murr патриот11.01.19 18:09
Murr
NEW 11.01.19 18:09 
в ответ hbrenner 11.01.19 15:37

что-то у Вас в коде (или в комманде) не на своем месте

-----

Что именно не так?

Возможность определять константы выбранного типа в Шарпе?

А чем именно это плохо? Я вот пока не вижу плохого.


сделать так:

-----

Избыточно и ничего принципиально нового.

То, что меня интересует:

public const ModelR33 r33 = Model.ModelType.R33.
#24 
Murr патриот11.01.19 18:21
Murr
NEW 11.01.19 18:21 
в ответ Программист 11.01.19 16:41

Скорее всего Murr значительно упростил пример.

-----

Да, Я убрал все лишнее - чтобы ничего не мешало понять что именно нужно.


генерируется шаблонами T4

-----

В данном случае - нет.


в шаблоне проще сгенерировать

-----

В шаблоне без разницы что именно выдавать как результат - TModel._R32 или TModel.R32... if() или switch-case...

А вот путаться каждый раз в том что именно использовано - строковая константа или константа типа TModel - совершенно не хочется.

Хочется иметь константу и иметь правила для ее сравнения, отличные от стандартных.


#25 
hbrenner прохожий11.01.19 22:28
hbrenner
NEW 11.01.19 22:28 
в ответ Murr 11.01.19 18:09, Последний раз изменено 11.01.19 23:19 (hbrenner)

Ох, я с самого начала неправильно понял в чем проблема, извините.


Как сделать то, что вы ищите я не знаю. Удивлюсь, если это окажется невозможным. Я пробывал с определением операторов приведения типов. Не работает так.


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. Но теперь понимаю, что проблема совсем не в этом. Недосмотрел.

#26 
Срыв покровов коренной житель12.01.19 08:53
12.01.19 08:53 
в ответ hbrenner 11.01.19 15:37
protected ModelType _modelType;

public ModelType getModelType() { return _modelType; } 


Ява-программист детектед))


#27 
Срыв покровов коренной житель12.01.19 09:01
NEW 12.01.19 09:01 
в ответ hbrenner 11.01.19 15:37
class ModelR33 : Model
{ public ModelR33() : base(Model.ModelType.R33) { }

class ModelR34 : Model
{ public ModelR34() : base(Model.ModelType.R34) { }
Коллега, а если тебе нужно сделать Белку и Стрелку, ты тоже для каждой делаешь класс и наследуешь от собаки?))

#28 
1 2 все