Фінальний клас

Фінальний клас — це ідіома проектування, яка полягає в ідеї, що від класу, який ми у цьому випадку робимо "фінальним", не можна успадковуватися.

Значення

  • Частково симулює 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-клас.

Примітки

    This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.