C#: Public, Private и Protected или «Инкапсуляция во всей красе»

Доброго времени суток всем тем, кто по какой бы не было причине оказался на странице моего блога. Сегодня у меня появилось желание рассказать о том что же такое атрибуты доступа private, public и protected для элементов класса на примере языка программирования C#. Остальные ОО языке в принципе ни чем и не отличаются…

Для начала немного по умничаем и поговорим о таком умном слове как инкапсуляция.

Инкапсуляция — одна из главных составляющих объекто-ориентированного программирования, смысл которой заключается в определении атрибута доступа к элементам внутри класса. Другими словами это механизм, позволяющий четко определить какие данные по сути играют роль внутренних состояний объекта, а какие являются общедоступными.

В языке программирования C#, да и во всех других ОО-языках выделяют три атрибута доступа: public, private, protected.

Public — определяет элемент как общедоступный. обратиться к данной переменной или функции можно как в рамках класса, так и путем создания экземпляра класса.
Private (по умолчанию) — определяет элемент как закрытый для доступа, обратиться к данной переменной или функции можно только в рамках нашего класса.
Protected — определяет элемент как закрытый для доступа, обратиться к данной переменной или функции можно только в рамках нашего класса, а так же в классе наследнике.

Например:

class MyClass
    {
        int a; //по умолчанию private 
        private int sum(int b)
        {
            return this.a + b + this.x;
        }
        protected int x = 5;
        public void ShowSum(int b)
        {
            MessageBox.Show(this.sum(b).ToString());
        }

        public MyClass() {
            this.a = 0;
        }
        public MyClass(int a) {
            this.a = a;
        }
    }

class MySecondClass: MyClass
    {
        public MySecondClass(int x)
        {
            //this.a = x; - это не верная строка
            //переменная 'a' и функция 'sum' в наследнике не доступны 
            this.x = x;
            this.ShowSum(this.x);
        }
    }

И выполним код:

MyClass MC = new MyClass(1);
MC.ShowSum(4); //Выведет 10
MySecondClass MSC = new MySecondClass(10); //Выведет 20
//int x1 = MC.x; - ошибка
//int x2 = MSC.x; - ошибка

Теперь немного опишем почему в первом случае мы получаем 10, а во втором 20. Первая строка создает нам экземпляр класса ‘MyClass‘ и присваивает переменной ‘a‘ значение 1. Вторая строка, показывает результат скрытой функции ‘sum‘ с аргументом b=4, которая по сути складывает числа 1, 5 и 4 (a=1, x=5, b=4). Третья строка создает объект класса ‘MySecondClass‘ и сразу покажет нам результат функции ‘sum‘. Который является результатом сложения 0, 10 и 10 (a=0, x=10, b=10). Стоит отметить что a=0 берется из класса родителя, а точнее из конструктор по умолчанию ‘public MyClass()‘, так же стоит заметить что ни к переменной ‘a‘ ни к функции ‘sum‘ обращаться в классе ‘MySecondClass‘ напрямую мы не можем.

Вот как то так. Надеюсь что мое описание было доступным даже самым неопытным программистам, только начинающим изучать технологию объекто-ориентированного прграммирования.

Запись опубликована в рубрике C# с метками , , , , , , . Добавьте в закладки постоянную ссылку.