1629295407-c61bfe4caba98380ea3e7cdae6295416 (846200), страница 26
Текст из файла (страница 26)
Объект, на который ссылается переменная house1, не меняется.Глава 6. Введение в классы, объекты и методы133МетодыКак упоминалось выше, переменные экземпляров и методы — две основныесоставляющие классов. Пока наш класс Building содержит только данные.
Хотя такиеклассы (без методов) вполне допустимы, большинство классов имеют методы. Методы —это процедуры (подпрограммы), которые манипулируют данными, определенными вклассе, и во многих случаях обеспечивают доступ к этим данным. Обычно различные частипрограммы взаимодействуют с классом посредством его методов.Любой метод содержит одну или несколько инструкций. В хорошей C#-программеодин метод выполняет только одну задачу. Каждый метод имеет имя, и именно это имяиспользуется для его вызова. В общем случае методу можно присвоить любое имя.
Нопомните, что имя Main() зарезервировано для метода, с которого начинается выполнениепрограммы. Кроме того, в качестве имен методов нельзя использовать ключевые слова C#.Имена методов в тексте этой книги сопровождаются парой круглых скобок.Например, если метод имеет имя getval, то в тексте будет написано getval(). Этопомогает отличать имена переменных от имен методов.Формат записи метода такой:доступ тип_возврата имя(список_параметров) {// тело метода}Здесь элемент доступ означает модификатор доступа, который определяет, какиечасти программы могут получить доступ к методу. Как упоминалось выше, модификатордоступа необязателен, и, если он не указан, подразумевается, что метод закрыт (private)в рамках класса, где он определен. Пока мы будем объявлять все методы как publicчлены, чтобы их могли вызывать все остальные составные части программного кода, дажете, которые определены вне класса.С помощью элемента тип_возврата указывается тип значения, возвращаемогометодом.
Это может быть любой допустимый тип, включая типы классов, создаваемыепрограммистом. Если метод не возвращает никакого значения, необходимо указать типvoid. Имя метода, как нетрудно догадаться, задается элементом имя. В качестве имениметода можно использовать любой допустимый идентификатор, отличный от тех, которыеуже использованы для других элементов программы в пределах текущей областивидимости.
Элемент список_параметров представляет собой последовательность пар(состоящих из типа данных и идентификатора), разделенных запятыми. Параметры — этопеременные, которые получают значения аргументов, передаваемых методу при вызове.Если метод не имеет параметров, список_параметров остается пустым.Добавление методов в класс BuildingКак вам уже известно, методы класса, как правило, манипулируют данными,определенными в классе, и обеспечивают доступ к этим данным.
Зная это, вспомним, чтометод Main() в предыдущей программе вычислял площадь, приходящуюся на одногочеловека, путем деления общей площади здания на количество жильцов.Несмотря на формальную корректность, эти вычисления выполнены не самымудачным образом. Ведь с вычислением площади, приходящейся на одного человека, вполнеможет справиться сам класс Building, поскольку эта величина зависит только отзначений переменных area и occupants, которые инкапсулированы в классе Building. Какговорится, сам Бог велел классу Building выполнить это арифметическое134Часть I. Язык C#действие.
Более того, если оно таки будет “закреплено” за этим классом, то другойпрограмме, которая его использует, не придется делать это действие “вручную”. Здесьналицо не просто удобство для “других” программ, а предотвращение неоправданногодублирования кода. Наконец, внося в класс Building метод, который вычисляет площадь,приходящуюся на одного человека, вы улучшаете его объектно-ориентированнуюструктуру, инкапсулируя внутри рассматриваемого класса величины, связанныенепосредственно со зданием.Чтобы добавить в класс Building метод, необходимо определить его внутри объявлениякласса.
Например, следующая версия класса Building содержит метод с именемareaPerPerson(), который отображает значение площади конкретного здания,приходящейся на одного человека.// Добавление метода в класс Building.using System;class Building {public int floors; // количество этажейpublic int area; // общая площадь зданияpublic int occupants; // количество жильцов// Отображаем значение площади, приходящейся//на одного человека.public void areaPerPerson() {Console.WriteLine(" " + area / occupants +" приходится на одного человека");}}// Используем метод areaPerPerson().class BuildingDemo {public static void Main() {Building house = new Building();Building office = new Building();// Присваиваем значения полям в объекте house.house.occupants = 4;house.area = 2500;house.floors = 2;// Присваиваем значения полям в объекте office.office.occupants = 25;office.area = 4200;office.floors = 3;Console.WriteLine("Дом имеет:\n " +house.floors + " этажа\n " +house.occupants + " жильца\n " +house.area +" квадратных футов общей площади, из них");house.areaPerPerson();Console.WriteLine();Console.WriteLine("Офис имеет:\n " +Глава 6.
Введение в классы, объекты и методы135office.floors + " этажа\n " +office.occupants + " работников\n " +office.area +" квадратных футов общей площади, из них");}}office.areaPerPerson();Эта программа генерирует результаты, которые совпадают с предыдущими:Дом имеет:2 этажа4 жильца2500 квадратных футов общей площади, из них625 приходится на одного человекаОфис имеет:3 этажа25 работников4200 квадратных футов общей площади, из них168 приходится на одного человекаТеперь рассмотрим ключевые элементы этой программы, начиная с самого методаareaPerPerson(). Первая строка этого метода выглядит так:public void areaPerPerson() {В этой строке объявляется метод с именем areaPerPerson(), который не имеетпараметров. Этот метод определен с использованием спецификатора доступа public,поэтому его могут использовать все остальные части программы. МетодareaPerPerson() возвращает значение типа void, т.е.
не возвращает никакогозначения. Эта строка завершается открывающей фигурной скобкой, за которой должнонаходиться тело метода.Так и есть. Тело метода areaPerPerson() состоит из единственной инструкции:Console.WriteLine(" " + area / occupants +" приходится на одного человека");Эта инструкция отображает площадь здания, которая приходится на одного человека,путем деления значения переменной area на значение переменной occupants.Поскольку каждый объект типа Building имеет собственную копию значений area иoccupants, то при вызове метода areaPerPerson() в вычислении площади здания,которая приходится на одного человека, будут использоваться копии этих переменных,принадлежащие конкретному вызывающему объекту.Метод areaPerPerson() завершается закрывающей фигурной скобкой, т.е.
приобнаружении закрывающей фигурной скобки управление программой передаетсявызывающему объекту.Теперь рассмотрим внимательнее строку кода из метода Main():house.areaPerPerson();Эта инструкция вызывает метод areaPerPerson() для объекта house. Каквидите, для этого используется имя объекта, за которым следует оператор “точка”.
Привызове метода управление выполнением программы передается телу метода, а после егозавершения управление возвращается автору вызова, и выполнение программывозобновляется со строки кода, которая расположена сразу за вызовом метода.В данном случае в результате вызова house.areaPerPerson() отображаетсязначение площади, которая приходится на одного человека, для здания, определенногообъектом house. Точно так же в результате вызова office.areaPerPerson()отображается значение площади, которая приходится на одного человека, для здания,136Часть I. Язык C#определенного объектом office.
Другими словами, каждый раз, когда вызывается методareaPerPerson(), отображается значение площади, которая приходится на одногочеловека, для здания, описываемого заданным объектом.Обратите внимание вот на что. Переменные экземпляра area и occupantsиспользуются внутри метода areaPerPerson() без каких бы то ни было атрибутов, т.е.им не предшествует ни имя объекта, ни оператор “точка”. Это очень важный момент: еслиметод задействует переменную экземпляра, которая определена в его классе, он делает этонапрямую, без явной ссылки на объект и без оператора “точка”.
И это логично, Ведь методвсегда вызывается для некоторого объекта конкретного класса. И если уж вызов состоялся,объект, стало быть, известен. Таким образом, нет необходимости указывать внутри методаобъект во второй раз. Это значит, что значения area и occupants внутри методаareaPerPerson() неявно указывают на копии этих переменных, принадлежащихобъекту, который вызывает метод areaPerPerson().Возвращение из методаВ общем случае существует два варианта условий для возвращения из метода.Первый связан с обнаружением закрывающей фигурной скобки, обозначающей конец теламетода (как продемонстрировано на примере метода areaPerPerson()), Второй вариантсостоит в выполнении инструкции return. Возможны две формы использованияинструкции return: одна предназначена для void-методов (которые не возвращаютзначений), а другая — для возврата значений. В этом разделе мы рассмотрим первуюформу, а в следующем — вторую.Немедленное завершение void-метода можно организовать с помощью следующейформы инструкции return:return;При выполнении этой инструкции управление программой передается автору вызоваметода, а оставшийся код опускается.