Модификатор в языке С — это некое специальное слово, которое добавляется к методам, классам, переменным, функциям и и дает специальные «надстройки» основному компоненту. Модификаторы в С бывают разных видов. Например:
-
модификаторы параметров,
-
модификаторы типов данных,
-
модификаторы доступа,
-
и др.
Каждый отдельный вид модификаторов — это тема отдельной статьи. Поэтому сегодня мы поговорим про модификаторы доступа, а остальные виды оставим на потом.
Модификаторы доступа в С
Модификаторы доступа — это вид модификаторов, которые определяют и задают допустимую область доступа для класса, рядом с которым они располагаются. Все классы и методы в С имеют собственные модификаторы доступа.
Модификаторы доступа в С обозначаются следующими ключевыми словами:
-
Ключевое слово «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».
Заключение
Модификаторы доступа в С помогают открывать или закрывать доступ к компонентам в той или иной ситуации. Как они ограничивают доступ к компонентам — отлично видно в таблице, расположенной чуть выше. А в примере видно, как работают модификаторы в конкретной ситуации на практике. Принцип их работы разобрать нетрудно, но понимать их обязательно, так как это основа ООП.