пятница, 29 июня 2012 г.

C# Работа с классами и методами (функциями)

Класс — это шаблон, который определяет форму объекта. Он задает как данные, так и код, который оперирует этими данными. C# использует спецификацию класса для создания объекта. Объекты — это экземпляры класса. Таким образом, класс — это множество намерений (планов), определяющих, как должен быть построен объект. Важно четко понимать следующее: класс — это логическая абстракция. О ее реализации нет смысла говорить до тех пор, пока не создан объект класса, и в памяти не появилось физическое его представление.

Общая форма определения класса
Определяя класс, вы определяете данные, которые он содержит, и код, манипулирующий этими данными. Несмотря на то что очень простые классы могут включать только код или только данные, большинство реальных классов содержат и то, и другое.

Данные содержатся в переменных экземпляров, определяемых классом, а код — в методах. Однако важно с самого начала отметить, что класс определяет также ряд специальных членов данных и методов-членов, например статические переменные, константы, конструкторы, деструкторы, индексаторы, события, операторы и свойства.

Класс создается с помощью ключевого слова class. Общая форма определения класса, который содержит только переменные экземпляров и методы, имеет следующий вид:
class имя_класса {
           // Объявление переменных экземпляров. доступ тип переменная1;
           доступ тип переменная2;
           //...
           доступ тип переменнаяN;
           // Объявление методов.
           доступ тип_возврата метод1(параметры) {
                     // тело методов
           }
           доступ тип_возврата метод2(параметры) {
                     // тело метода
           }
           доступ тип_возврата методN(параметры) {
                     // тело метода
           }
}
Определение класса
Для иллюстрации мы создадим класс, который инкапсулирует информацию о зданиях (домах, складских помещениях, офисах и пр.). В этом классе (назовем его Building) будут храниться три элемента информации о зданиях (количество этажей, общая площадь и количество жильцов).

Ниже представлена первая версия класса Building. В нем определены три переменные экземпляра: floors, area и occupants. Обратите внимание на то, что класс Building не содержит ни одного метода. Поэтому пока его можно считать классом данных.

class Building
{
    public int floors; // количество этажей
    public int area; // общая площадь основания здания
    public int occupants; // количество жильцов
}

Чтобы реально создать объект класса Building, используйте, например, такую инструкцию:
Building house = new Building(); // Создаем объект // типа Building

При каждом создании экземпляра класса создается объект, который содержит собственную копию каждой переменной экземпляра, определенной этим классом. Таким образом, каждый объект класса Building будет содержать собственные копии переменных экземпляра floors, area и occupants. Для доступа к этим переменным используется оператор “точка” (.). Оператор “точка” связывает имя объекта с именем его члена. Общий формат этого оператора имеет такой вид:
объект.член
Как видите, объект указывается слева от оператора “точка”, а его член — справа. Например, чтобы присвоить переменной floors значение 2, используйте следующую инструкцию.
house.floors = 2;
В общем случае оператор “точка” можно использовать для доступа как к переменным экземпляров, так и методам.
Рассмотрим полную программу, в которой используется класс Building.



// Программа, в которой используется класс Building.
using System;
class Building {
  public int floors; // количество этажей
  public int area; // общая площадь основания здания
  public int occupants; // количество жильцов
}
// Этот класс объявляет объект типа Building.
class BuildingDemo
{
    public static void Main()
    {
        Building house = new Building(); // Создание объекта
        // типа Building.
        int areaPP; // Площадь, приходящаяся на одного жильца.
        // Присваиваем значения полям в объекте house.
        house.occupants = 4;
        house.area = 2500;
        house.floors = 2;
        // Вычисляем площадь, приходящуюся на одного жильца дома.
        areaPP = house.area / house.occupants;
        Console.WriteLine(
             "Дом имеет:\n " +

    house.floors + " этажа\n " +
    house.occupants + " жильца\n " +
    house.area +
    " квадратных футов общей площади, из них\n "
    + areaPP + " приходится на одного человека");
    }
}

Эта программа состоит из двух классов: Building и BuildingDemo. Внутри класса BuildingDemo метод Main() сначала создает экземпляр класса Building с именем house, а затем получает доступ к переменным этого экземпляра house, присваивая им конкретные значения и используя эти значения в вычислениях. Важно понимать, что Building и BuildingDemo — это два отдельных класса. Единственная связь между ними состоит в том, что один класс создает экземпляр другого. Хотя это отдельные классы, код класса BuildingDemo может получать доступ к членам класса Building, поскольку они объявлены открытыми, т.е. public-членами. Если бы в их объявлении не было спецификатора доступа public, доступ к ним ограничивался бы рамками класса Building, а класс BuildingDemo не имел бы возможности использовать их.

Если предыдущую программу назвать UseBuilding.cs, то в результате ее компиляции будет создан файл UseBuilding.exe. Классы Building и BuildingDemo автоматически становятся составными частями этого исполняемого файла. 



Методы (Функции)
Как упоминалось выше, переменные экземпляров и методы — две основные составляющие классов. Пока наш класс Building содержит только данные. Хотя такие классы (без методов) вполне допустимы, большинство классов имеют методы. Методы — это процедуры (подпрограммы), которые манипулируют данными, определенными в классе, и во многих случаях обеспечивают доступ к этим данным. Обычно различные части программы взаимодействуют с классом посредством его методов.

Любой метод содержит одну или несколько инструкций. В хорошей C#-программе один метод выполняет только одну задачу. Каждый метод имеет имя, и именно это имя используется для его вызова. В общем случае методу можно присвоить любое имя. Но помните, что имя Main() зарезервировано для метода, с которого начинается выполнение программы. Кроме того, в качестве имен методов нельзя использовать ключевые слова C#.

Имена методов в тексте этой книги сопровождаются парой круглых скобок. Например, если метод имеет имя getval, то в тексте будет написано getval(). Это помогает отличать имена переменных от имен методов.

Формат записи метода такой: 


доступ тип_возврата имя(список_параметров) {
// тело метода
Здесь элемент доступ означает модификатор доступа, который определяет, какие части программы могут получить доступ к методу. Модификатор доступа необязателен, и, если он не указан, подразумевается, что метод закрыт (private) в рамках класса, где он определен. Пока мы будем объявлять все методы как public- члены, чтобы их могли вызывать все остальные составные части программного кода, даже те, которые определены вне класса. 

С помощью элемента тип_возврата указывается тип значения, возвращаемого методом. Это может быть любой допустимый тип, включая типы классов, создаваемые программистом. Если метод не возвращает никакого значения, необходимо указать тип void. Имя метода, как нетрудно догадаться, задается элементом имя. В качестве имени метода можно использовать любой допустимый идентификатор, отличный от тех, которые уже использованы для других элементов программы в пределах текущей области видимости. Элемент список_параметров представляет собой последовательность пар (состоящих из типа данных и идентификатора), разделенных запятыми. 


Параметры — это переменные, которые получают значения аргументов, передаваемых методу при вызове. Если метод не имеет параметров, список_параметров остается пустым.  


Возврат значения

Хотя void-методы — не редкость, большинство методов все же возвращают значение. И в самом деле, способность возвращать значение — одно из самых полезных качеств метода.


Методы возвращают значения вызывающим их процедурам, используя следующую форму инструкции return:
return значение;
Здесь элемент значение и представляет значение, возвращаемое методом.
Пример консольного приложения:



// Демонстрация возврата значения методом areaPerPerson().

using System;

class Building
{
    public int floors; // количество этажей
    public int area; // общая площадь здания
    public int occupants; // количество жильцов
    // Возврат значения площади, которая
    // приходится на одного человека.
    public int areaPerPerson()
    {
        return area / occupants;
    }
}
// Использование значения от метода areaPerPerson().
class BuildingDemo
{
    public static void Main()
    {
        Building house = new Building();
        Building office = new Building();
        int areaPP;  // Площадь, которая приходится
        // на одного человека.
        // присваиваем значения полям в объекте house.
        house.occupants = 4;
        house.area = 2500;
        house.floors = 2;// Присваиваем значения полям в объекте office.
        office.occupants = 25;
        office.area = 4200;
        office.floors = 3;
        // Получаем для объекта house площадь, которая
        // приходится на одного человека.
        areaPP = house.areaPerPerson();
        Console.WriteLine("Дом имеет:\n " +
             house.floors + " этажа\n " +
             house.occupants + " жильца\n " +
             house.area +
             " квадратных футов общей площади, из них\n " +
             areaPP + " приходится на одного человека");
        Console.WriteLine();
        // Получаем площадь для объекта office, которая
        // приходится на одного человека.
        areaPP = office.areaPerPerson();
        Console.WriteLine("Офис имеет:\n " +
             office.floors + " этажа\n " +
             office.occupants + " работников\n " +
             office.area +
             " квадратных футов общей площади, из них\n " +
             areaPP + " приходится на одного человека");
    }
}


0 коммент.:

Отправить комментарий

TROCKII БЛОГ Copyright © 2012 | Template created by Lev Trockii |