cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Добавить sealed классы #393

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +0, -7 Автор идеи: Игорь Шаповал

В С++11 добавили контексные ключевые слова final, override. В языках C#, Kotlin (и в скором времени в Java) есть упакованные классы. Мы можем определить список ограниченных классов наследников от базового класса.

Предлагаю добавить контекстное ключевое слово sealed так как final, override.

class figure sealed {
   virtual int square() const;

   class triangle;
   class rectangle;
};

class triangle : figure {            // ok
   int square() override { ... }
}

class rectangle : figure {           // ok
   int square() override { ... }
}

class circle : figure {              // error
   int square() override { ... }
}
apolukhin commented 3 years ago

Игорь Шаповал, 22 декабря 2018, 13:15 Написали двое человек что против. Пожайлуства указывайте причину, почему нет?

Александр Коновалов, 7 января 2019, 6:07 Игорь Шаповал, нет каких-то реальных примеров, в которых это может быть полезно. Пока выглядит как пустая фича, смысл от которой стремится к нулю.

Игорь Шаповал, 26 декабря 2018, 13:51 yndx-antoshkka, что скажете может быть в будущем такая фича в С++?

yndx-antoshkka, 26 декабря 2018, 18:53 Игорь Шаповал, нужны красивые примеры использования, а лучше примеры реализации каких-нибудь паттернов программирования, которые без sealed хорошо не реализовать.

Игорь Шаповал, 27 декабря 2018, 9:59 Раньше люди писали и без override, final. И как-то жили. А в С++11 добавили и жить не могут.

Игорь Шаповал, 10 января 2019, 21:35 Это полезно при паттерн матчинге и крутого switch.

https://kotlinlang.ru/docs/reference/sealed-classes.html

yndx-antoshkka, 10 января 2019, 22:04 Игорь Шаповал, мне бы пример на C++, где это полезно. А то в других языках, другие правила игры и другие подходы к решению задач.

languagelawyer, 4 февраля 2019, 14:45 По ссылке имитация variant через наследование.

Никита Колотов, 23 ноября 2019, 17:08 Я вот тоже проголосовал против. В упомянутом C# модификатор sealed полностью запрещает наследование от данного класса, то есть работает аналогично final. В Котлин модификатор sealed до версии 1.1 ограничивал перечень классов, которые могли бы наследоваться от данного только вложенными классами, а затем только классами из того же файла. По какому принцыпу должно работать ограничение в этом предложении - непонятно. Ведь объявления class triangle; и class rectangle; согласно существующим правилам являются предварительными объявлениями вложенных классов figure::triangle и figure::rectangle, а наследуются затем несвязанные одноименные классы из глобального пространства имен.

pavel-zhigulin commented 3 years ago

Я не знаю, имеет смысл тут вообще что-то писать? :) Я вот тоже выскажусь против. Увеличивается связность кода, а профит - не ясен. Единственный пока приведенный пример с паттерн-матчингом не убедителен. Лучше уж заморочиться и ввести rust-like enum-ы, где каждый элемент - это тип.