Скачиваний:
2
Добавлен:
04.09.2023
Размер:
1.17 Mб
Скачать

23 Свойства c# (Понятие инкапсуляции и свойства в c#. Использование ключевых слов «get» и «set». Преимущества использования свойств.)

Инкапсуляция – свойство системы, позволяющее объединить данные и методы, работающие с ними в классе.

Объект и класс (набор программ изначально задумывался как одно целое) «синонимы».

При этом инкапсуляция означает, что класс должен защищать целостность данных, которые он инкапсулирует.

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

Т. о. суть инкапсуляции - в быстрой и безопасной организации иерархической управляемости через сокрытие собственно реализации (чтобы было достаточно простой команды «что делать», без одновременного уточнения как именно делать).

Цель инкапсуляции – уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса. 

Существует 4 вида модификаторов доступа: publicprotectedprivate и default.

Public – уровень предполагает  доступ к компоненту с этим модификатором из экземпляра любого класса и любого пакета.

Protected – уровень  предполагает  доступ к компоненту с этим модификатором из экземпляров родного класса и классов-потомков, независимо от того, в каком пакете они находятся.

Default – уровень предполагает  доступ к компоненту с этим модификатором из экземпляров любых классов, находящихся в одном пакете с этим классом.

Private – уровень предполагает  доступ к компоненту с этим модификатором только из этого класса.

Свойство – это специальное поле класса, содержащее программный код доступа к внутренним переменным (полям) класса или вычисления некоторого значения. Свойства обеспечивают удобный и рациональный путь доступа к внутренней переменной в классе.

Общая форма объявления свойства в классе:

type PropName {

get {

// код для чтения внутреннего поля (переменной)

// ...

}

set {

// код для записи значения во внутреннее поле (переменную)

// ...

}

}

где

  • type – тип данных возвращаемый свойством;

  • PropName – имя свойства. По этому имени идет обращение к свойству;

  • get – аксессор, который используется для чтения значения из внутреннего поля класса;

  • set – аксессор, используемый для записи значения во внутреннее поле класса. Аксессор set получает неявный параметр value, содержащий значение, которое присваивается свойству.

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

  • обеспечивается более рациональный и естественной доступ к внутренним переменным класса;

  • в коде аксессоров можно реализовывать разного рода проверки на допустимость значений внутренних переменных класса;

  • гибкость в правах доступа к внутренней переменной: отсутствие аксесора set позволяет реализовать доступ «только для чтения» для внутренних данных класса. Это, в свою очередь, делает невозможным случайное изменение этих данных.

  • Главное преимущество свойства заключается в том, что его имя может быть использовано в выражениях и операторах присваивания аналогично имени обычной переменной, но в действительности при обращении к свойству по имени автоматически вызываются его аксессоры get и set.

Get – что-то берем

Set – что-то кладем

Class X

{

Public int x; // Определение класса - должны определить переменную доступную

другим классам

}

X1 = new X(); // Экземпляр класса

int y;

y = X1*X или X1*X = 15 // В переменную “y“ записали значение X

Залезаем в class X и можем туда что-то записать

Придумали get и set «дубляж» действия присваивания

class A

{

int x; // Переменная private по умолчанию

public int X // Метод, обеспечивающий доступ к х

{

get {return x; } // выдача наружу

set {x = value; } // присваивание величины

}

}

Внутренняя переменная – строчная буква

Внешняя переменная – заглавная буква

Программа, использующая А

A1 = new A(); // создание экземпляра класса А

A1*X = 15 // вызов оператора set из Х и через нее попадем к внутренней переменной «х»

int y = A1*X // вызов оператора get для чтения «х»

Создали get и set для обращения к внутренним переменным.

Переменная year ϵ [1;6] по условию

class student

{

int year;

.

.

.

public int Year;

{

get {return year;}

set {

if (value < 1) year = 1; // присваиваем ближайший. Нарушение области доп.знач

else if (value > 6) year = 6; // Нарушение области доп.знач.

else year = value; }

}

Во внешней программе использование будет выглядеть:

Student St1 = new Student ()

St1.Year = 0; // Вызов set, проверка value и запись правильного значения

int a = St1.Year; // Вызов get