ideas
ideas copied to clipboard
Добавить sealed классы
Перенос предложения: голоса +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 { ... }
}
Игорь Шаповал, 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, а наследуются затем несвязанные одноименные классы из глобального пространства имен.
Я не знаю, имеет смысл тут вообще что-то писать? :) Я вот тоже выскажусь против. Увеличивается связность кода, а профит - не ясен. Единственный пока приведенный пример с паттерн-матчингом не убедителен. Лучше уж заморочиться и ввести rust-like enum-ы, где каждый элемент - это тип.