Фінальний клас
Фінальний клас — це ідіома проектування, яка полягає в ідеї, що від класу, який ми у цьому випадку робимо "фінальним", не можна успадковуватися.
Значення
- Частково симулює final функція класу.
- Частково або повністю запобігти успадковування від класу.
Також відомий, як
- Sealed Class
Мотивація
Можлива ситуація, коли розробники захочуть обмежити наслідування чи розширення функціональності класу користувачем. У різних мовах програмування ця функціональність забезпучується. Наприклад у Java ключове слово - final, тоді коли у C# це - sealed. Ідіома Final Class реалізує цю можливість у С++.
Solution та приклад коду
Final class ідіома робить використання віртуального наслідування і дружнього класу, щоб продекламувати ефект фінального класу. Ідіома залежить від одного з правил С++: конструктор (та деструктор) унаслідуваного класу визиваються безпосередньо нащадком. Якщо доступ до конструктора чи деструктора запобігається, то клас не може мати нащадків.
class MakeFinal
{
MakeFinal() {} // private by default.
friend class sealed;
};
class sealed : virtual MakeFinal
{ };
class test : public sealed
{ };
int main (void)
{
test t; // Compilation error here.
}
У наведеному прикладі клас test наслідується від sealed-класу, а main функція намагається створити екземпляр класу test. Створення провалюється, оскільки клас test не може отримати доступ до приватного деструктора класу MakeFinal тому що він визначений як private та є предком test.
Зауважте, що ця помилка виникає лише тоді, коли клас test є нащадком від MakeFinal. Компілятор не буде скаржитися доки клас test виконується, не наслідуючи sealed-клас.