Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 30
Текст из файла (страница 30)
футов общей площади, из них1п агеаРР + " приходится на одного человека"); Ниже приведен результат выполнения этой программы. дом имеет: 2 этажа 4 жильца 2500 кв. футов общей плошади, иэ них 625 приходится на одного человека Учреждение имеет: 3 этажа 25 работников 4200 кв.
футов общей площади, из них 188 приходится на одного человека Как видите, данные из объекта )тоцзе полностью отделены от данных, содержап(ихся в объекте от к1се. Эта ситуация наглядно показана на рис. 6.1. Глава 6. Введение в классы, объекты и методы 149 Рис. 6.1. Переменные экземпляра одного объекта полностью отделены от переменных экземпляра другого объекта Создание обьектов В предыдущих примерах программ для объявления объекта типа В011б1пд использовалась следующая строка кода: Вл11бьпд Ьооае пеи Ви1101пч()) Эта строка объявления выполняет три функции.
Во-первых, объявляется переменная )юпзе, относяшаяся к типу класса В011б1пд. Сама эта переменная не является объектом, а лишь переменной, которая может ссьиаглься на объект. Во-вторых, создается конкретная, физическая копия обьекта. Это делается с помощью оператора пеы. И наконец, переменной поиэе присваивается ссылка на данный объект. Таким образом, после выполнения анализируемой строки обьявленная переменная попав ссылается на объект типа вп11б1по. Оператор и ее динамически (т.е.
во время выполнения) распределяет память для объекта и возврашает ссылку на него, которая затем сохраняется в переменной. Следовательно, в С№ для всех объектов классов должна быть динамически распределена память. Как и следовало ожидать, объявление переменной полее можно отделить от создания объекта, на который'она ссылается, следующим образом: Ви1101пч Ьооае; // объявить ссылку иа объект Паоле = пеи В011бьпд()) // распределить объект типа Вл1101пч В первой строке объявляется переменная полее в виде ссылки на объект типа В011б1пп. Следовательно, после — это переменная, которая может ссылаться на объект, хотя сама она не является объектом.
А во второй строке создается новый объект типа В011бдпгп и ссылка на него присваивается переменной пепле. В итоге переменная попав оказывается связанной с данным объектом. То обстоятельство, что объекты классов доступны по ссылке, объясняет, почему классы называются ссылочными типами Главное отличие типов значений от ссылочных типов заключается в том, что именно содержит переменная каждого из этих типов. Так, переменная типа значения содержит конкретное значение. Например, во фрагменте кода 1пс х; х = 10) переменная х содержит значение 10, поскольку она относится к типу 1пк, который является типом значения. Но в строке Ви1101по Полее = пеи В01101пд()' переменная полее содержит не сам объект, а лишь ссылку на него. 150 Часть ), язык Сз Переменные ссылочного типа и присваивание В операции присваивания переменные ссылочного типа действуют иначе, чем переменные типа значения, например типа 1пс.
Когда одна переменная типа значения присваивается другой, ситуация оказывается довольно простой. Переменная, находящаяся в левой части оператора присваивания, получает копию значения переменной, находящейся в правой части этого оператора. Когда же одна переменная ссылки на объект присваивается другой, то ситуация несколько усложняется, поскольку такое присваивание приводит к тому, что переменная, находящаяся в левой части оператора присваивания, ссылается на тот же самый объект, на который ссылается переменная, находящаяся в правой части этого оператора.
Сам же объект не копируется. В силу этого отличия присваивание переменных ссылочного типа может привести к несколько неожиданным результатам. В качестве примера рассмотрим следующий фрагмент кода: Ви11бьпд Лоиве1 = пен Ви11бьпЧ() Ви11и1пд Поиве2 = Поиве1) На первый взгляд, переменные )коияе1 и )зоиве2 ссылаются на совершенно отдельные объекты, но на самом деле это не так. Переменные )коиве1 и )ксив е2, напротив, ссылаются на один и тот же объект.
Когда переменная Ьоиве1 присваивается переменой )коиве2, то в конечном итоге переменная )коиве2 просто ссылается на тот же самый объект, что и переменная )зоияЕ1. Следовательно, этим объектом можно оперировать с помощью переменной )коиве1 или )коияе2. Например, после очередного присваивания Поиве1.Агеа = 2бОО) оба метода Иг1сеь1пе () Сопво1е.нк1пеЬ1пе(ьоиве1.Агеа) сопяо1е.икьсеьапе Фоиве2.Агеа) выводят одно и то же значение: 2600.
Несмотря на то что обе переменные, )коиве1 и )коиве2, ссылаются на один и тот же объект, они никак иначе не связаны друг с другом. Например, в результате следующей последовательности операций присваивания просто изменяется объект, на который ссылается переменная )коиве2: Ви11к)1пч Поиве1 = пен Вищбьпд(); Ви11б1пи Поиве2 Поияе11 Ви11к)1пд Лоивез = пен Ви11бьпч(); Поиве2 Поивезк // теперь обе переменные, Ьоиве2 н // Поивез, ссыпаются на один н тот же объект. После выполнения этой последовательности операций присваивания переменная ' )коияе2 ссылается на тот же самый объект, что и переменная ПоивеЗ.
А ссылка на объект в переменной )зоиве1 не меняется. Методы Как пояснялось выше, переменные экземпляра и методы являются двумя основными составляющими классов. До сих пор класс Ви11г)1пя, рассматриваемый здесь в качестве примера, содержал только данные, но не методы. Хотя данные, содержащие только дан- Глава 6.
Введение в классы, объекты и методы 151 иые, вполне допустимы, у большинства классов должны быть также методы. Методы представляют собой подпрограммы, которые манипулируют данными, определенными в классе, а во многих случаях оии предоставляют доступ к этим данным. Как правило, другие части программы взаимодействуют с классом посредством его методов. Метод состоит из одиого или нескольких операторов. В грамотно написанном коде С№ каждый метод выполняет только одну функцию.
У каждого метода имеется свое имя, по которому ои вызывается. В обшем, методу в качестве имени можно присвоить любой действительиый идентификатор. Следует, однако, иметь в виду, что идентификатор Майо () зарезервирован для метода, с которого начинается выполнение программы. Кроме того, в качестве имен методов нельзя использовать ключевые слова С№. В этой книге методы именуются в соответствии с условными обозначениями, принятыми в литературе по С№. В частности, после имени метода следуют круглые скобки. Так, если методу присвоено имя Сегт)а1, то в тексте книги ои упоминается в следующем виде; ~ест)а1 () .
Такая форма записи помогает отличать имена методов от имен перемепиых при чтении книги. Ниже приведена общая форма метода. доступ аозрааатемтая тип имя(список параметрса) ( О тело метода где доступ — это модификатор доступа, определяюший те части программы, из которых может вызываться метод. Как пояснялось выше, указывать модификатор доступа иеобязательио. Но если ои отсутствует, то метод оказывается закрытым Грг1ттаге) в пределах того класса, в котором ои объявляется. Мы будем пока что объявлять методы открытыми (ри)т11с), чтобы вызывать их из любой другой части кода в программе.
Затем в парад(а емый тип обозначает тип данных, возврашаемых методом. Этот тип должеи быть действительным, в том числе и типом создаваемого класса. Если метод ие возвращает значение, то в качестве возвращаемого для него следует указать тип чойс1 Далее имя обозначает конкретное имя, присваиваемое методу В качестве имени метода может служить любой допустимый идентификатор, ие приводящий к конфликтам в текущей области объявлеиий. И наконец, список параметров — это последовательность пар, состоящих из типа и идентификатора и разделенных запятыми. Параметры представляют собой переменные, получающие значение аргументов, передаваемых методу при его вызове.
Если у метода отсутствуют параметры, то список параметров оказывается пустым. Добавление метода в класс Вих16хлд Как пояснялось выше, методы класса, как правило, манипулируют данными класса и предоставляют доступ к иим. С учетом этого напомним, что в приведенных выше примерах в методе мавп () вычислялась площадь иа одного человека путем деления обшей плошзди здания иа количество жильцов. И хотя такой способ формально считается правильным, иа самом деле он оказывается далеко ие самым лучшим для организации по! добиого вычисления. Плошадь иа одного человека лучше всего вычислять в самом классе Во11к)1оо, просто потому, что так легче понять сам характер вычисления. Ведь плоюадь иа одного человека зависыт от значений в полях Агеа и Оссораогз, инкапсулированных в классе Ви11с)1оо.
Следовательно, данное вычисление может быть вполне произведеио в самом классе Вы11к)1оо. Кроме того, вводя вычисление площади иа одного человека в класс во11с)1псоь мы тем самым избавляем все программы, пользуюшиеся классом Вы11г)1осоь от необходимости выполнять это вычисление самостоятельно. Благодаря это- 152 Часть!, язык СЗ му исключается ненужное дублирование кода. И наконец, добавление в класс Ви114(1пс метода, вычисляющего площадь на одного человека, способствует улучшению его объектно-ориентированной структуры, поскольку величины, непосредственно связанные со зданием, инкапсулируются в классе Ви11б1пд.