Открываем VisualStudio (у вас стоит 2010 версия), далее через меню файл создаем новое консольное приложение для языка C#. У вас откроется заготовка со стандартным классом Program.
Советую прочитать пример инкапсуляции до конца а затем набирать код. Код дополняется и модифицируется по ходу действий.
Весь код приводится ниже.
Классы нужно создавать ниже класса Program, но чтобы они не выходили за рамки namespace.
Новый объект и обращение к нему производим в нашем главном классе Program.
У нас есть новый тип данных - TAirplan . Если мы попробуем использовать этот класс следующим образом:
то обнаружим следующие ошибки. Во-первых, для создания экземпляра класса недостаточно объявить соответствующую переменную. Экземпляр класса необходимо создать с помощью оператора New. Дело в том, что переменная типа класса на самом деле является не переменной, а ссылкой на переменную. По сути ссылка - это адрес в памяти, где должна храниться переменная. Поэтому процедура создания класса включает в себя выделение соответствующей памяти, инициализации полей класса и присвоение ссылке адреса выделенной памяти. Создать экземпляр класса можно следующим образом:
Во-вторых, использование полей класса и вызов его методов в строках:
будет невозможным. Дело в том, что по умолчанию определенные поля и методы являются закрытыми от внешнего обращения. К таким полям можно обращаться только из методов самого класса. Для того, чтобы сделать возможным общаться к полям и методам класса необходимо использовать спецификаторы доступа.
В C# существуют следующие спецификаторы доступа:
public
protected
private
new
internal
static
readonly
volatile
Некоторые спецификаторы могут использоваться совместно, а некоторые являются взаимоисключающими. По умолчанию, если не указан спецификатор доступа, полям и методам присваивается спецификатор private. Этот спецификатор означает, что к данному полю и методу невозможно обратиться из другого класса и даже из класса - наследника нашего класса. Спецификатор protected аналогичен спецификатору private за исключением того, что поля и методы с этим спецификатором "видны" для классов наследников данного класса. Наиболее либеральным является спецификатор public. К полям и методам, помеченным этим спецификатором, можно обращаться из любых других классов. Может показаться, что легче всего помечать все поля и методы public, чтобы "не мучаться". Часто начинающие программисты именно так и поступают. Однако такой подход противоречит идеологии объектно-ориентированного программирования. Важная идея инкапсуляции состоит в сокрытии внутренних полей и методов от внешней среды. Может показаться удивительным, но порой чем меньше мы знаем о внутреннем устройстве класса, тем легче и безопаснее им пользоваться.
Возвращаясь к примеру, разумно дать возможность вызывать метод IncAltitude() для изменения высоты. Для этого нужно назначить для метода IncAltitude спецификатор доступа - public. Но не стоит давать возможность пользователям класса самостоятельно изменять высоту путем доступа к полю Altitude, поскольку тогда возможно превышение порога высоты. В тоже время, если у поля Altitude будет спецификатор доступа private, то пользователь не сможет не только изменить это поле, но и прочитать. Для этого нужно создать еще один метод, который будет выдавать пользователю значение высоты:
Таким образом мы контролируем, чтобы пользователь всегда получал значение высоты, округленное до ближайшего целого.
Если создать класс в таком виде:
и использовать его таким образом:
то мы увидим строку "Высота = 100". Объясняется это тем, что мы никак не инициализировали поля перед использованием. C# всегда инициализирует переменные типа double нулем, но желательно инициализировать переменные явно. В объектно-ориентированном программировании каждый класс может иметь специальный метод (и даже не один) называемый конструктором. Конструктор - это метод, который всегда вызывается при создании экземпляра класса. Если в классе не определен ни один конструктор, то компилятор создает конструктор по умолчанию. Конструктор имеет следующие черты, которые выделяют его из других методов.
1. Имя конструктора всегда совпадает с именем класса. Никакой другой метод не может иметь имя, совпадающее с именем класса.
2. Конструктор не имеет возвращаемого типа. Никакой другой метод не может не иметь возвращаемого типа.
3. Конструктор можно вызвать только путем создания экземпляра класса.
Добавим в класс конструктор:
Теперь создавать экземпляр класса нужно следующим образом: