Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч
Download 2.46 Mb.
|
Язык программирования C#
8.4. Свойства
Концепция ООП не разрешает прямой доступ к полям объекта, и поля класса обычно создаются со спецификаторами доступа private или protected. Подчас же доступ к полям все же необходим, в таких случаях можно использовать либо пары методов SetValue() и GetValue(), либо специализированное средство языка C# - свойства. Для доступа к скрытым или защищенным полям класса предпочтительнее использовать свойства так, как их вызов схож с простым обращением к полю класса. Свойство может быть доступно только для чтения, только для записи или для чтения и записи одновременно. Общий формат для объявления свойств доступных для чтения и записи имеет следующий вид: спецификатор памяти спецификатор доступа тип имя_свойства { спецификатор доступа set { } спецификатор доступа get { return значение; } } Если свойство доступно только для чтения, блок set следует опустить. спецификатор памяти спецификатор доступа тип имя_свойства { спецификатор доступа get { return значение; } } Если свойство доступно только для записи, то следует опустить блок get. спецификатор памяти спецификатор доступа тип имя_свойства { спецификатор доступа set { } } Блоки set и get называются аксесорами. Свойства являются просто удобным способом записи функций для доступа к объекту. Аксесор set используется для ввода данных. Для сохранения значения в set блоке определена переменная value, в которой хранится переданное свойству значение. Аксесор get используется для вывода данных. Блок get обязательно должен содержать оператор return для возвращения значения, представляемого свойством. Спецификаторы доступа могут отсутствовать, тогда по умолчанию используется спецификатор private, спецификатор памяти static ставится, если программист хочет сделать поле статическим. Свойства могут быть статическими (static) или экземплярными. Доступ к свойствам может быть открытым (public), закрытым (private), защищенным (protected) или открытым внутри сборки (internal). class TimePeriod { private double seconds; public double Hours { get { return seconds / 3600; } set { seconds = value * 3600; } } } Лист. 8.17 Для иллюстрации работы со свойствами создадим класс для хранения информации о сотруднике некого предприятия. class Employee { // поля private string sName; private string sFamilyName; private int iAge; // конструктор public Employee() { sName = ""; sFamilyName = ""; iAge = 0; } // проверка имени или фамилии private static bool CheckName(string str) { for (int i = 0; i < str.Length; i++) if (!char.IsLetter(str[i])) return false; return true; } // свойство для доступа к имени public string Name { set { if (!CheckName(value)) { Console.WriteLine("Ошибка: Неправильно введено” + “имя."); return; } sName = value; char.ToUpper(sName[0]); for (int i = 0; i < sName.Length; i++) char.ToLower(sName[i]); } get
if (sName == "") { Console.WriteLine("Ошибка: Имя еще не введено."); return ""; } else return sName; } } // свойство для доступа к фамилии public string FamilyName { set { if (!CheckName(value)) { Console.WriteLine("Ошибка:Неправильно введена фамилия."); return; } sFamilyName= value; char.ToUpper(sFamilyName[0]); for (int i = 0; i < sFamilyName.Length; i++) char.ToLower(sFamilyName[i]); } get
if (sFamilyName == "") { Console.WriteLine("Ошибка: Фамилия еще не введена."); return ""; } else return sFamilyName; } } // свойство для доступа к возрасту public int Age { set { if (value < 18 || value > 60) { Console.WriteLine("Ошибка: Неправильно введен возраст."); return; } iAge = value; } get
if (iAge == 0) { Console.WriteLine("Ошибка: Возраст еще не введена."); return 0; } else return iAge; } } } Лист. 8.18 В листинге определен класс для работы с сотрудником Employee. У этого класса три закрытых поля: sName типа string для хранения имени сотрудника, sFamilyName типа string для хранения фамилии сотрудника и iAge типа int для хранения возраста сотрудника. Конструктор класса при создании объекта просто обнуляет эти поля. Для доступа к закрытым полям класса определены три доступных как для чтения, так и для записи свойства: Name, FamilyName и Age. Свойство Name типа string связано с полем sName, Свойство FamilyName типа string связано с полем sFamilyName и Свойство Age типа int связано с полем iAge. При вводе данных свойства проверяют их на релевантность и если данные некорректны, то выводят ошибку, а если корректны, то сохраняют их в связанные со свойствами поля. При выводе данных свойства проверяют, были ли данные уже введены и если не были, возвращают ошибку и значения по умолчанию(в реальной программе в таком случае алгоритм бы вернул исключение), а если были, то просто возвращают значения связанных со свойствами полей. Создадим теперь программу для тестирования класса Employee. class Program { static void Main(string[] args) { Employee Coder = new Employee(); // пытаемся получить доступ к еще неинициализированным полям Console.WriteLine("Имя: " + Coder.Name); Console.WriteLine("Фамилия: " + Coder.FamilyName); Console.WriteLine("Возраст: " + Coder.Age); // пытаемся ввести неправильные значения Coder.Name = "Nyk0r"; Coder.FamilyName = "0001"; Coder.Age = -1; // вводим релевантные значения Coder.Name = "Tslik"; Coder.FamilyName = "Mozgunov"; Coder.Age = 19; // выводим значения Console.WriteLine("Имя: " + Coder.Name); Console.WriteLine("Фамилия: " + Coder.FamilyName); Console.WriteLine("Возраст: " + Coder.Age); } } Лист. 8.19 В приведенном листинге создается объект класса Employee Coder, при создании объекта конструктор обнуляет поля объекта. Затем программа пытается посредством свойств получить доступ к еще не инициализированным полям объекта Coder, на что объект отвечает сообщениями об ошибках. Далее метод пытается записать в поля объекта Coder некорректные данные, и снова свойства защищают целостность объекта, не давя записать неправильные данные. В конце в объект Coder записываются и считываются правильные данные, эти операции проходят, как обычные обращения к полям. Вывод программы: Ошибка: Имя еще не введено. Имя: Ошибка: Фамилия еще не введена. Фамилия: Ошибка: Возраст еще не введен. Возраст: 0 Ошибка: Неправильно введено имя. Ошибка: Неправильно введена фамилия. Ошибка: Неправильно введен возраст. Имя: Tslik Фамилия: Mozgunov Возраст: 19 Вывод. 8.6 Download 2.46 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling