- •Лекция №1-2 Тема: Объектно-ориентированный подход в программировании
- •Абстрагирование
- •Инкапсуляция
- •Наследование
- •Жизненный цикл
- •Атрибуты класса
- •Операции класса
- •Описание классов с помощью c#
- •Internal (внутренний) – компонент доступен только из классов, принадлежащих сборке, в которой определен данный класс (в том числе и самому классу).
- •Способы достижения инкапсуляции в c#
- •Конструкторы классов
Internal (внутренний) – компонент доступен только из классов, принадлежащих сборке, в которой определен данный класс (в том числе и самому классу).
После модификатора области видимости следует описание компонента. Для данных это:
его тип (стандартный или пользовательский);
имя, уникальное в пределах класса;
опционально, начальное значение, которое поле получит при создании объекта класса (в С++ такая возможность отсутствует и данные инициализируются только с помощью конструктора).
Сразу отметим, что эти же модификаторы доступа справедливы и для методов класса.
При объявлении компонентов данных можно использовать ключевое слово const, которое обозначает, что после начальной инициализации данное не может быть изменено. В отличии от С++ этот модификатор нельзя использовать для методов. Доступ к таким данным возможен из методов класса по имени. Доступ из внешних методов может осуществляться только через имя класса (не через имя объекта).
Без дополнительных объявлений каждый компонент относится к конкретному экземпляру. В C# существует возможность объявить компоненты, которые будут иметь отношение ко всему классу (ко всем его объектам в равной степени – хотя такое утверждение и не совсем верно). Такие компоненты называются статическими. Для их объявления используется ключевое слово static.
Нестатические данные каждого объекта хранятся в отдельной области памяти, независимо от других объектов данного класса. Можно создать любое количество объектов данного класса, и присвоить его полю разные значения для каждого объекта класса. Статические данные совместно используются всеми экземплярами объектов классов (обычно это счетчики созданных объектов, хотя им можно найти и другое применение).
Статические методы могут быть вызваны без создания объектов класса. При этом для их вызова вместо имени объекта используется имя класса. Статические данные могут получать доступ только к статическим данным класса (объяснение этому в теме про указатель this). Обращаться к статическим данным можно из статических и нестатических методов класса. Доступ из внешних модулей к статическим данным происходит через имя класса.
Способы достижения инкапсуляции в c#
Аналогично С++. Для каждого закрытого (защищенного) данного создается пара методов. Один из них может установить значение закрытой переменной, второй вернуть его во внешнюю программу. Метод для получения информации называется accessor, метод для изменения информации – mutator.
Не совсем инкапсуляция, но служит для защиты данных класса. Использование полей с модификатором readonly. Значение такого поля можно изменить при инициализации или в конструкторе класса.
Можно описать статические поля для чтения. По сути, они будут аналогичны полям, определенным с модификатором const. Различие здесь только одно: константа заменяется своим значением в процессе компиляции, а статическое поля «только для чтения» - на этапе выполнения программы.
С помощью свойств класса (property) – с наибольшей степени соответствующий концепции ООП способ. Свойства являются объединением данных и методов в одно целое. Внешне при обращении к свойству синтаксис совпадает с обращением к полю. На самом деле свойство в общем случае состоит из двух скрытых внутренних методов. Преимущества свойств заключается в том, что вместо использования двух отдельных методов, можно использовать одно единственное свойство и работать с ним как с открытой переменной-компонентом класса.
Свойство C# описывается как обычная переменная, но после имени переменной идут операторные скобки в которых могут быть два блока:
блок доступа (get), в котором обязательно должен быть оператор return.
блок изменения (set), в котором может использоваться ключевое слово value, которое представляет собой правую часть выражения изменения значения свойства.
Для внутреннего представления свойства реально создаются два метода get_Name() и set_Name() с соответствующими сигнатурами. (проверить, что это действительно так в л.р. №2).
Можно создавать свойства только для чтения (с одним блоком get), только для записи (с одним блоком set). Также свойства могут быть статическими (справедливо все то же что и для статических методов).
