Керівництво c #, доступ до членів класу

Підтримка властивості інкапсуляції в класі дає дві головні переваги. По-перше, клас пов'язує дані з кодом. І по-друге, клас надає кошти для управління доступом до його членам. Саме ця, друга переважна особливість і буде розглянута в даній статті.

У мові C #, по суті, є два типи членів класу: відкриті і закриті. хоча в дійсності справа йде трохи складніше. Доступ до відкритого члену вільно здійснюється з коду, визначеного за межами класу. А закритий член класу доступний тільки методами, визначеними в самому класі. За допомогою закритих членів і організовується управління доступом.

Обмеження доступу до членів класу є основним етапом об'єктно-орієнтованого програмування, оскільки дозволяє виключити невірне використання об'єкта. Вирішуючи доступ до закритих даних тільки за допомогою чітко визначеного ряду методів, можна попередити присвоювання невірних значень цих даних, виконуючи, наприклад, перевірку діапазону представлення чисел. Для закритого члена класу можна задати значення безпосередньо в коді за межами класу. Але в той же час можна повністю управляти тим, як і коли дані використовуються в об'єкті. Отже, правильно реалізований клас утворює якийсь "чорний ящик", яким можна користуватися, але внутрішній механізм його дії закритий для втручання ззовні.

модифікатори доступу

Управління доступом в мові C # організовується за допомогою чотирьох модифікаторів доступу. public. private. protected і internal.

Коли член класу позначається специфікатором public. він стає доступним з будь-якого іншого коду в програмі, включаючи і методи, визначені в інших класах. Коли ж член класу позначається специфікатором private. він може бути доступний тільки іншим членам цього класу. Отже, методи з інших класів не мають доступу до закритого члену (private) даного класу. Eсли жоден з специфікаторів доступу не вказано, член класу вважається закритим для свого класу за замовчуванням. Тому при створенні закритих членів класу специфікатор private вказувати для них необов'язково.

За допомогою модифікатора доступу protected забезпечується створення захищеного члена класу, доступ до якого відкритий в межах ієрархії класів. А модифікатор internal служить в основному для збірок.

Для наочності давайте розглянемо приклад:

Як бачите, доступ до членів b і c закритий, але незважаючи на це, вільний доступ до них організований за допомогою конструктора. З усього сказаного вище можна зробити наступний важливий висновок: закритий член може вільно використовуватися іншими членами цього ж класу, але недоступний для коду за межами свого класу.

Організація закритого і відкритого доступу

Правильна організація закритого і відкритого доступу - запорука успіху в об'єктно-орієнтованому програмуванні. І хоча для цього не існує твердо встановлених правил, нижче перерахований ряд загальних принципів. які можуть служити в якості керівництва до дії:

Члени, які використовуються тільки в класі, повинні бути закритими

Дані екземпляра, що не виходять за певні межі значень, повинні бути закритими, а при організації доступу до них за допомогою відкритих методів слід виконувати перевірку діапазону представлення чисел

Якщо зміна члена призводить до наслідків, що поширюється за межі області дії самого члена, тобто впливає на інші аспекти об'єкта, то цей член повинен бути закритим, а доступ до нього - контрольованим

Члени, які можуть завдати шкоди об'єкту, якщо вони використовуються неправильно, повинні бути закритими. Доступ до цих членам слід організувати за допомогою відкритих методів, що виключають неправильне їх використання

Методи, які отримують і встановлюють значення закритих даних, повинні бути відкритими

Змінні примірника допускається робити відкритими лише в тому випадку, якщо немає ніяких підстав для того, щоб вони були закритими

Зрозуміло, існує чимало ситуацій, на які наведені вище принципи не поширюються, а в особливих випадках один або кілька цих принципів можуть взагалі порушуватися. Але в цілому, дотримуючись цих правил, ви зможете створювати об'єкти, стійкі до спроб неправильного їх використання.