У С# є ключове слово sealed, що дозволяє описати клас, від якого, в протилежність абстрактному, успадковувати забороняється:
sealed class Spirit
{
.
}
// class Monster : Spirit { ... }помилка!
Більшість вбудованих типів даних описана як sealed. Якщо необхідно використовувати функціональність безплідного класу, застосовується не спадкоємство, а вкладення (включення): у класі описується поле відповідного типу.
Вкладення класів це коли один клас включає поля, що є класами. Наприклад, якщо є об'єкт "двигун", а потрібно описати об'єкт "літак", логічно зробити двигун полем цього об'єкту, а не його предком.
Оскільки поля класу зазвичай закриті, виникає питання, як же користуватися методами включеного об'єкту. Загальноприйнятий спосіб полягає в тому, щоб описати метод охоплюючого класу, з якого викликати метод включеного класу. Такий спосіб взаємин класів відомий як модель включення-делегування. Приклад приведений в лістингу 8.4.
Лістинг 8.4. Модель включення
using System;
namespace examp51
{
class Двигатель
{
public void Запуск()
{
Console.WriteLine("вжжжж!!");
}
}
class Самолет
{
public Самолет()
{
левый = new Двигатель();
правый = new Двигатель();
}
public void Запустить_двигатели()
{
левый.Запуск();
правый.Запуск();
}
Двигатель левый, правый;
}
class Class1
{
static void Main()
{
Самолет AH24_1 = new Самолет();
AH24_1.Запустить_двигатели();
}
}
}
Результат роботи програми:
вжжжж!!
вжжжж!!
У методі “Запустити двигуни” запит на запуск двигунів передається, або, як прийнято говорити, делегується вкладеному класу.