Изолированные классы в C#

Изолированные классы используются для ограничения пользователей от наследования класса. Класс можно изолировать с помощью ключевого слова sealed . Ключевое слово сообщает компилятору, что класс изолирован и, следовательно, не может быть расширен. Никакой класс не может быть производным от изолированного класса.

Ниже приводится синтаксис изолированного класса:

sealed class class_name
{
    // data members
    // methods
    .
    .
    .
}

Метод также можно изолировать, и в этом случае метод не может быть переопределен. Однако метод может быть изолирован в классах, в которых он унаследован. Если вы хотите объявить метод как изолированный, он должен быть объявлен как виртуальный в его базовом классе.

Следующий пример класса определяет изолированный класс в C#:

Далее создайте изолированный класс SealedClass и используйте его из `Program`.

// C# code to define
// a Sealed Class
using System;
  
// Sealed class
sealed class SealedClass {
  
    // Calling Function
    public int Add(int a, int b)
    {
        return a + b;
    }
}
  
class Program {
  
    // Main Method
    static void Main(string[] args)
    {
  
        // Creating an object of Sealed Class
        SealedClass slc = new SealedClass();
  
        // Performing Addition operation
        int total = slc.Add(6, 4);
        Console.WriteLine("Total = " + total.ToString());
    }
}

Вывод :

Итого = 10

Теперь, если попытаться унаследовать класс от изолированного класса, будет выдана ошибка, в которой говорится, что «Класс не может быть производным от изолированного класса .

// C# code to show restrictions
// of a Sealed Class
using System;
  
class Bird {
  
}
  
// Creating a sealed class
sealed class Test : Bird {
}
  
// Inheriting the Sealed Class
class Example : Test {
}
  
// Driver Class
class Program {
  
    // Main Method
    static void Main()
    {
    }
}

Ошибка:

Ошибка CS0509 "Пример": не может быть производным от изолированного типа "Тест"

Рассмотрим следующий пример изолированного метода в производном классе:

// Программа C # для
// демонстрации изолированного класса
using System;
  
class Printer {
  
    // Функция отображения для
		// вывода размеров
    public virtual void show()
    {
        Console.WriteLine("display dimension : 6*6");
    }
  
    // Display Function
    public virtual void print()
    {
        Console.WriteLine("printer printing....\n");
    }
}
  
// класс-наследник
class LaserJet : Printer {
  
    // Sealed Display Function
    // for Dimension printing
    sealed override public void show()
    {
        Console.WriteLine("display dimension : 12*12");
    }
  
    // Function to override
    // Print() function
    override public void print()
    {
        Console.WriteLine("Laserjet printer printing....\n");
    }
}
  
// Класс Officejet не может переопределить метод show
// метод изолирован классе родителе LaserJet.
class Officejet : LaserJet {
  
    // can not override show function or else
    // compiler error : 'Officejet.show()' : 
    // cannot override inherited member
    // 'LaserJet.show()' because it is sealed.
    override public void print()
    {
        Console.WriteLine("Officejet printer printing....");
    }
}
  
// Driver Class
class Program {
  
    // Driver Code
    static void Main(string[] args)
    {
        Printer p = new Printer();
        p.show();
        p.print();
  
        Printer ls = new LaserJet();
        ls.show();
        ls.print();
  
        Printer of = new Officejet();
        of.show();
        of.print();
    }
}

Вывод :

размер дисплея: 6 * 6
Печать на принтере ....

размер дисплея: 12 * 12
Печать на принтере LaserJet ....

размер дисплея: 12 * 12
Печать на принтере Officejet ....

Объяснение: В приведенном выше коде C # класс Printer имеет блок отображения с размером 6 * 6, а класс LaserJet реализовал метод show, переопределив его так, чтобы он имел размер 12 * 12. Если какой-либо класс унаследует класс LaserJet, тогда он будет иметь такое же измерение 12 * 12 и не сможет реализовать собственное, т.е. он не может иметь 15 * 15, 16 * 16 или любые другие размеры. Таким образом, вызов LaserJet изолирует метод show, чтобы предотвратить его дальнейшее переопределение.

Для чего нужны изолированные классы и методы?

  • Изолированный класс используется для прекращения наследования класса. Вы не можете наследовать или расширять какой-либо класс от него.
  • Изолированный метод реализован таким образом, что никакой другой класс не может его переопределить и реализовать свой собственный метод.
  • Основная цель изолированного класса - отобрать возможность наследования у пользователя, чтобы он не мог получить класс от изолированного класса. Изолированные классы лучше всего использовать, когда у вас есть класс со статическими членами.
    например, классы “Pens” и “Brushes” пространства имен System.Drawing. Класс Pens представляет перья для стандартных цветов. Этот класс имеет только статические члены. Например, «Pens.Red» представляет собой перо красного цвета. Точно так же класс «Brushes» представляет стандартные кисти. «Brushes.Red» представляет собой кисть красного цвета.