grig_p
Наурыз 5, 2022, 1:33 Т.Қ.

Работа с классами

Здравствуйте!
Столкнулся с проблемой. Не знаю, как к ней подойти.
Допустим, есть суперкласс и несколько подклассов, количество которых со временем будет расти. В этих классах имебтся статичные методы, имеющие один смысл, но работающие чуть по разному.

  1. class Base
  2. {
  3. }
  4.  
  5. class C1 : public Base
  6. {
  7. static void read();
  8. static void write();
  9. static void open();
  10. static void close();
  11. ...
  12. }
  13.  
  14. class C2 : public Base
  15. {
  16. static void read();
  17. static void write();
  18. static void open();
  19. static void close();
  20. ...
  21. }
  22.  

Мне нужно в зависимости от некоего строкового значения:
1) вызывать статичные методы нужного класса
2) создвавть экземпляры классов
Для вызова статичного метода просматривается следующий путь:

  1. if (st == StringValue1)
  2. C1::read();
  3. else
  4. if (st == StringValue2)
  5. C2::read();
  6. ...
  7.  

Для создания экземпляра:

  1. Base *base{nullptr} ;
  2. if (st == StringValue1)
  3. base = new C1();
  4. else
  5. if (st == StringValue2)
  6. base = new C2();
  7. ...
  8.  

И так далее. Для вызова каждого метода нужно создавать линейку if - else if, что громоздко и в последствие сложно сопровождаемо.

Вопрос, можно ли как-то это упростить? Можно ли указать список в одном месте, а потом вызывать методы?
Буду очень благодарен за помощь.
С уважением, Григорий

2

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

3
Виктор Калесников
  • Наурыз 5, 2022, 3:02 Т.Қ.
  • (өңделген)

Использовать switch и enum.

    Виктор Калесников
    • Наурыз 5, 2022, 3:08 Т.Қ.
    • (өңделген)

    Если совсем красиво делать то применить шаблон ООП "Стратегия"

      grig_p
      • Наурыз 5, 2022, 3:17 Т.Қ.

      Спасибо.
      Но разве в switch можно использовать строки, как ключи?
      А чем поможет enum?

        Пікірлер

        Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
        Кіріңіз немесе Тіркеліңіз