Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 67

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 61 62 63 64 65 66 < 67 > 68 69 70 71 72 73 .. 320 >> Следующая

Средства инкапсуляции в С#
Принцип инкапсуляции предполагает, что ко внутренним данным объекта (переменным-членам) нельзя обратиться напрямую через экземпляр этого объекта. Вместо этого для получения информации о внутреннем состоянии объекта и внесения изменений необходимо использовать специальные методы. В С# инкапсуляция реализуется на уровне синтаксиса при помощи ключевых слов public, private и protected. В качестве примера мы рассмотрим следующее определение класса:
150 Глава 3 • С# и объектно-ориентированное программирование
Класс с едина веянью полем public class Book {
public int numberOfPages:
Г
Термин «иол'.'» (field) используется для открытых данных класса — переменных, объявленных с ключевым словом publ 1с. При использовании полей в приложении возникает проблема: полю можно присвоить любое значение, а организовать проверку этого значения бизнес-логике вашего приложения достаточно сложно. Например, для нашей открытой переменной numberOfPages используется тип данных і nt. Максимальное значение для этого типа данных - это достаточно большое число (2 147 483 647). Если в программе будет существовать такой код, проблем со стороны компилятора не возникнет:
// Задумаемся...
public static void MainO
{
Book mi пі Novel = new BookO; miniNovel .numberOfPages-- 30000000:
}
Тип данных вполне позволяет указать для книги небольших размеров количество страниц, равное ЗО 000 000. Однако понятно, что книг такой величины не бывает, и во избежание дальнейших проблем желательно использовать какой-нибудь механизм проверки, который отсеивал бы явно нереальные значения (например, он пропускал бы только значения между 1 и 2000). Применение поля —
открытой переменной не дает нам возможности простым способом реализовать
подобный механизм. Поэтому поля в реальных рабочих приложениях используются нечасто.
Следование принципу инкапсуляции позволяет защитить внутренние данные класса от неумышленного повреждения. Для этого достаточно все внутренние данные сделать закрытыми (объявив внутренние переменные с использованием ключевых слов private или protected). Для обращения к внутренним данным можно использовать один из двух способов:
• создать традиционную пару методов — один для получения информации
(accessor), второй — для внесения изменений (mutator);
• определить именованное свойство.
Еще один метод защиты данных, предлагаемый — использовать ключевое слово readonly. Однако какой бы способ вы ни выбрали, общий принцип остается тем же самым — инкапсулированный класс должен прятать детали своей реализации от внешнего мира. Такой подход часто называется «программированием по методу черного ящика». Еще одно преимущество такого подхода заключается в том, что вы можете как угодно совершенствовать внутреннюю реализацию своего класса, полностью изменяя его содержимое. Единственное, о чем вам
придется позаботиться, — чтобы в новой реализации остались методы с той же сигнатурой и функциональностью, что и в предыдущих версиях. В этом случае
вам не придется менять ни строчки существующего кода за пределами данного класса.
Средства инкапсуляции в С# 151
Реализация инкапсуляции при помощи традиционных методов доступа и изменения
Давайте вновь обратимся к нашему классу Етр1 оуее. Если мы хотим, чтобы внешний мир смог работать с внутренними данными этого класса (пусть это будет только одна переменная ful 1 Name, для которой используется тип данных stri ng), то традиционный подход рекомендует создание метода доступа (accessor, nnHget method) и метода изменения (mutator, или set method). Набор таких методов может выглядеть следующим образом:
// Определение традицокнид методов доступа и изменения для закрытой перейдися public class Employee
{ private string fullName:
Il Метод доступа
public string GetFullNameO (return fullName: }
// Метод иэненения
public void SetFul 1 Name (string n).
{
Il Логика для удаления неположенных символов (!J1 #. $. % и прочих // Логика для проверки максимальной длины и прочего fullName = п;
}
)
Такой подход требует наличия двух методов для взаимодействия с каждой переменных. Вызов этих методов может выглядеть следующим образом:
// Применение методов доступа и изменения public static int Main(string[] args)
{
Employee p = new EmployeeO: p.SetFunNameC'Fred"):
Console Mn teLine« "Employes is named: + p. GetFullNameO):
// Ошибка! К данным нельзя обращаться напрев
// через экземпляр объекта! // p.FullName: return 0;
}
Второй способ инкапсуляции: применение свойств класса
Помимо традиционных методов доступа и изменения для обращения к закрытым членам класса можно также использовать свойства (properties). В Visual Basic и СОМ свойства — это привычный инструмент. Свойства позволяют имитировать доступ к внутренним данным класса: при получении информации или внесении изменений через свойство синтаксис выглядит так же, как при обращении к обычной открытой переменной. Но на самом деле любое свойство состоит из двух скрытых внутренних методов. Преимущество свойств заключается в том, что вместо того, чтобы использовать два отдельных метода, пользователь класса может использовать единствен» >е свойство, работая с ним так же, как и с открытой переменной-членом данного класса:
Предыдущая << 1 .. 61 62 63 64 65 66 < 67 > 68 69 70 71 72 73 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100