Модификатор в языке С — это некое специальное слово, которое добавляется к методам, классам, переменным, функциям и и дает специальные «надстройки» основному компоненту. Модификаторы в С бывают разных видов. Например:
модификаторы параметров,
модификаторы типов данных,
модификаторы доступа,
и др.
Каждый отдельный вид модификаторов — это тема отдельной статьи. Поэтому сегодня мы поговорим про модификаторы доступа, а остальные виды оставим на потом.
Модификаторы доступа в С
Модификаторы доступа — это вид модификаторов, которые определяют и задают допустимую область доступа для класса, рядом с которым они располагаются. Все классы и методы в С имеют собственные модификаторы доступа.
Модификаторы доступа в С обозначаются следующими ключевыми словами:
Ключевое слово «private». Закрывает и делает приватным компонент, с которым определяется. Открывает доступ к этому программному компоненту исключительно в пределах класса или структуры, где определяется сам модификатор.
Ключевое выражение «private protected». Открывает доступ к этому программному компоненту из этого же класса или структуры, которая образовалась из этого же класса, где определен модификатор.
Ключевое слово «protected». Открывает доступ к этому программному компоненту, как и «private protected», дополнительно открывает доступность для классов, участвующих в сторонних структурах.
Ключевое слово «internal». Открывает доступ к программному компоненту из любого места того же кода или той же сборки, но оставляет компонент закрытым для сторонних программ и структур.
Ключевое выражение «protected internal». Объединяет возможности доступа к компоненту двух модификаторов: «protected» и «internal».
Ключевое слово «public». Это самый «открытый» модификатор доступа. Он делает компонент доступным откуда угодно: из любого места самой программы или из сторонних программ и структур.
Ограничение доступа при помощи модификаторов нагляднее видно в таблице:
Вид модификатора
Доступность в текущем объекте
Доступность во вторичном объекте этой же сборки
Доступность во вторичном объекте другой сборки
Доступность в не вторичном объекте этой же сборки
Доступность в не вторичном объекте другой сборки
Private
Открыта
Закрыта
Закрыта
Закрыта
Закрыта
Private protected
Открыта
Открыта
Закрыта
Закрыта
Закрыта
Protected
Открыта
Открыта
Открыта
Закрыта
Закрыта
Internal
Открыта
Открыта
Закрыта
Открыта
Закрыта
Protected internal
Открыта
Открыта
Открыта
Открыта
Закрыта
Public
Открыта
Открыта
Открыта
Открыта
Открыта
Модификаторы доступа применяются к компонентам класса. В компонентах структуры их тоже можно применять, исключив модификаторы «private», «protected», «protected internal». Если для компонентов явно не задается идентификатор, тогда к ним применяется модификатор «private», что делает компонент более закрытым. Это важный момент, который нужно учитывать.
Модификаторы доступа в С: пример в коде
Давайте придумаем произвольный класс и будем использовать разные модификаторы доступа:
class World
{
private object privateState = "State_is_private";
protected private object protectedPrivateState = "State_is_protected_private";
protected object protectedState = "State_is_protected";
internal object internalState = "State_is_internal";
protected internal object protectedInternalState= "State_is_protected_internal";
public object publicState = "State_is_public";
private void ReadPrivate() => Console.WriteLine(privateState);
protected private void ReadProtectedPrivate() => Console.WriteLine(protectedPrivateState);
protected void ReadProtected() => Console.WriteLine(protectedState);
internal void ReadInternal() => Console.WriteLine(internalState);
protected internal void ReadProtectedInternal() => Console.WriteLine(protectedInternalState);
public void ReadPublic() => Console.WriteLine(publicState);
}
Мы придумали объект «World», который имеет несколько полей с переменными. Каждая переменная обозначена разным видом модификатора, ограничивающего доступность к самой переменной. Также внутри класса мы определили несколько методов для вывода значения переменных в консоль. Теперь давайте разберем, как это все работает.
Давайте попробуем воспользоваться переменными объекта «World» в другом объекте, который локализуется в этом же программном продукте. Например:
class WorldCitizen
{
public void PrintWorld()
{
World world = new World();
Console.WriteLine(world .privateState); // Выдаст «error», в доступе отказано
Console.WriteLine(world .protectedPrivateState); // Выдаст «error», в доступе отказано
Console.WriteLine(world .protectedState); // Выдаст «error», в доступе отказано
Console.WriteLine(world .internalState);//Не выдаст «error», получится присвоить величину
Console.WriteLine(world .protectedInternalState); //Не выдаст «error», получится присвоить величину
Console.WriteLine(world .publicState); //Не выдаст «error», получится присвоить величину
}
}
Нетрудно заметить, что в классе «WorldCitezen» удалось получить доступность к переменным «internalState», «protectedInternalState» и «publicState» потому что только их модификаторы дают возможность обратиться к ним в рамках этого случая. Точно такая же ситуация будет и с методами класса «World».
Заключение
Модификаторы доступа в С помогают открывать или закрывать доступ к компонентам в той или иной ситуации. Как они ограничивают доступ к компонентам — отлично видно в таблице, расположенной чуть выше. А в примере видно, как работают модификаторы в конкретной ситуации на практике. Принцип их работы разобрать нетрудно, но понимать их обязательно, так как это основа ООП.

Другое