Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
45666666666666666666666666666666666666666666666....rtf
Скачиваний:
1
Добавлен:
10.07.2019
Размер:
224.9 Кб
Скачать

Основная трудность при написании компьютерных программ заключается в том, что компьютер и мы «воспитаны» разными родителями. Если бы это было не так, то мы обрели бы единое понимание окружающего мира и научились бы говорить на общем языке.

Таким образом нам было бы легче понимать друг друга. Мы могли бы просто попросить компьютер нарисовать кота и все.

Вы скажите: «Так давайте научим компьютер понимать нас!». Но компьютеры устроены совсем не так как человеческий мозг и «видят» мир совсем по-другому, поэтому обучить их мышлению подобному нашему — непростая задача.

Выходом может стать поиск компромиссного решения:

общий «взгляд на мир» и

общий язык, который способны понимать как люди, так и компьютеры.

Эта часть книги полностью посвящена изучению способов общения с компьютером. Потребуется несколько «развернуть» свое сознание, чтобы увидеть вещи с позиции компьютера. При этом придется пойти на взаимные уступки: компьютер сможет научиться многому (например узнает некоторые слова) из нашего мира, но и вы должны будите выучить кое-что из мира компьютеров. Попытайтесь забраться в «голову» компьютера и представить, как можно было бы изложить мысли.

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

Итак, давайте ненадолго забудем о компьютерах и представим, что вам крайне необходимо организовать общение с неким пришельцем. А история такова…

К счастью или нет, но что-то произошло во Вселенной и бог весть как это случилось, но вы и странный пришелец оказались на маленьком, пустынном острове посреди океана. После отчаянного «Привет, меня зовут Света, а тебя?», вы, в конце концов, решаете дать своему спутнику имя Алджи.

Подступивший голод дает о себе знать и вы замечаете несколько кокосов, растущих на высокой пальме, достать которые мог бы Алджи, но его помощи не стоит ждать, если не удастся найти взаимопонимания.

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

Будучи взволнованным собственным успехом, вы смотрите Алджи в глаза. «Алджи, пожалуйста, подними меня на плечи, чтобы я могла достать кокосы».

Он смотрит на вас озадаченно. Затем с таким же видом смотрит на изображение кокосовой пальмы. Потом опять на вас. И снова на рисунок. Бесполезно — он не понимает! Осознав свою ошибку, вы хватаетесь за голову и растерянно показываете на настоящую пальму. Но Алджи по-прежнему не может понять. Оказывается, он понимает только по рисункам. Ага! Вам постепенно становится ясно, что хотя Алджи и может использовать ваш язык, он, фактически, НЕ понимает реальных вещей, о которых вы говорите.

Каким-то образом необходимо прийти к общему взгляду на мир. Вы думаете, что все просто: раз удалось научить его языку, то можно также обучить понимать объекты реального мира. Но и через трое суток кокосы по-прежнему остаются на пальме. Уроки проходят не очень хорошо и вы теряете контроль по мере того как понимание ускользает от вас.

Вы не знаете, сон это, галлюцинации или видение, но фигура в белом появляется в ярком, туманном свете. Низкий голос подсказывает вам: «Вот отличный способ восприятия окружающего мира!». «Так вы и Знифф12 сможете добиться понимания». (Вы догадываетесь, что это должно быть настоящее имя Алджи.) Вы теряете чувство времени по мере того, как образы магически вкрадываются в ваш разум, обучая новому способу описания мира. Наконец успокоившись, вам удается выйти из этого беспечного состояния.

Встрепенувшись, вы хватаете Алджи за плечи: «Я все поняла, приятель, слушай внимательно то, что я тебе скажу». Алджи с нахмуренным видом вслушивается в вашу речь.

«В окружающем нас мире существуют различные классы объектов — растения, животные, голодные люди, инопланетяне и так далее».

«Сейчас я хотела бы рассказать тебе о существующих объектах на этом острове. А именно, если ты не заметил, меня очень интересует эта кокосовая пальма (которая, между прочим входит в класс называемый «растениями»). Мне также интересен вон тот слон. Ух ты! Странно, как это я не увидела его раньше». (Вы указываете на каждый объект, о котором говорите).

«Слон входит в класс, называемый «животными» и имеет некоторые важные для нас свойства, Алджи. Во-первых, все животные могут двигаться. Во-вторых, слон по-настоящему тяжелый. Наверное, тонны две, что пригодится нам. В-третьих, у него скверный характер, что тоже может оказаться полезным.

«Ну ладно, Алджи, теперь слушай меня ... «В окружающем нас мире непрерывно происходят события. Я проголодалась — это событие. Кокосы созревают — это событие. Иногда мы сами можем вызывать события, чтобы выполнить некоторое действие. У меня есть отличная мысль, давай вызовем событие «беспокойства слона», которое заставит его помочь нам выполнить действие «добывание кокосов».

«Давай разделим обязанности. Я вызову событие (отвлеку внимание слона на тебя), а ты заставишь его достать для нас кокосы, договорились?» При этом Алджи робко смотрит на вас и признает: «Света, я слышу твои слова, но не знаю как это сделать». Похлопывая товарища по спине, вы говорите: «Алджи, не беспокойся, я никогда не стану просить тебя о чем-либо, сначала не объяснив тебе метода выполнения этого действия». Вот что нужно будет сделать после того, как я отвлеку слона и скажу тебе «доставать кокосы»:

Выбегай из-за этого камня и вставай рядом с пальмой. Слон немедленно понесется к тебе.

В тот момент, когда он достигнет нарисованной мной на песке линии, беги изо всех сил (поворачивай в разные стороны, так как бегать взад и вперед — не лучшая мысль).

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

После этого возвращайся в исходную точку и сообщи результат.

Алджи надолго замирает, очевидно переваривая задание, прежде чем неожиданно достает суперсовершенное устройство связи. В течение некоторого времени он передает модемные звуки в это устройство и затем снова кладет его в карман. Вы спрашиваете: «Что все это было, Алджи?». Алджи отвечает: «Позволь мне перевести, Света ...

Существует класс объектов, называемых Икс-знифферами.

Я один из объектов такого класса, но есть и другие.

Все объекты этого класса обладают следующими свойствами:

- name (например мое имя — Знифф12)

- earShape (значение которого всегда «трубка»)

- likeToWatchTV (в большинстве случаев имеет значение истины, а в других случаях — лжи)

Должен признаться, что мое появление здесь не случайно. Ты попала в популярное ТВ-шоу «Остаться в живых». Но я только что позвонил своему продюсеру и сказал, что меня не удовлетворяет обещанная плата за такое задание. Он собирается немедленно выполнить метод ОтправитьСпасательнуюГруппу».

На этом сказочная история заканчивается. Смысл в том, что вам с Алджи удалось разработать общий способ описания мира — вы используете одни термины и одинаково понимаете их значение. Это, наряду с использованием единого языка, дает вам возможность общения.

Теперь представим, что вместо инопланетянина, вам нужно объясниться с компьютером. Решение будет аналогичным, как и в рассказанной истории. И проблему можно будет решить подобным образом: согласовав определенный общий способ взгляда на мир, который сможет обеспечивать как понимание человеком, так и машиной.

Подход с использованием «классов, объектов, свойств, событий и методов», о котором было рассказано в истории, не является безупречным. Это только один из способов, который можно выбрать для объяснения окружающего нас мира пришельцу. Важно то, чтобы вы оба договорились об описании мира единым образом. Такой взгляд на мир, который, между прочим, называется «объектно-ориентированным» подходом, стал очень популярным способом описания вещей компьютерам, и фактически, язык C# требует придерживаться именно его.

Итак, изучение языка C# это изучение способов описания вещей при помощи классов, объектов, событий, методов и т.д.

Если вы хотите, чтобы компьютер помог в выполнении необходимых вам действий, то:

Вам (как человеку) нужно выучить язык C# и научиться описывать вещи с ориентацией на объекты.

Вам необходимо установить приложение C# и другие сопутствующие программы. Теперь и компьютер сможет понимать язык C# и сможет работать с объектами, описанными в соответствии с объектно-ориентированным подходом.

Вот и все! Вы с компьютером имеете общее представление мира, а также язык, и вскоре будете общаться как старые приятели.

Позвольте теперь описать значение ориентации на объекты с точки зрения программиста.

Окружающий нас мир можно разделить на различные классы вещей, такие как «коты» или «дома» или «деревья». Такие классы можно считать категориями или метками для группировки сходных объектов. Задача заключается в поиске способа описания таких классов для компьютера, чтобы он мог выполнять с ними действия.

Каждый класс вещей включает определенные объекты, которые и нужны нам. Например, в класс «кот» входит мой кот Пушок, который является объектом класса котов. Подобным образом, розовый дом на углу моей улицы является объектом класса «дом», а дуб, видимый из окна моей спальни, является объектом класса «дерево». Если есть определенный объект, с которым должен работать компьютер, то нам необходимо создать некоторое описание для компьютера, которое представляет такой объект.

Для объектов характерны различные свойства. Свойства служат для более четкого описания объектов. Их можно сравнить с прилагательными в русском языке. Например, моего Пушка можно описать такими свойствами как рост, вес и рядом других.

События — это изменения, происходящие с объектом. В реальном мире события происходят вокруг нас непрерывно. Например, когда я глажу Пушка, это событие происходит с ним. Подобным образом, ветер, развевающий ветви дуба, видимого из моего окна — это событие, происходящее с деревом. События, как правило, представляют собой действия, воздействующие на определенный объект, но сам объект повлиять на них не может. В компьютерном мире событиями могут быть «нажатие кнопки» или «перемещение мыши».

Действия выполняются объектом. Например, кот Пушок лижет свою шерсть — это действие. В компьютерном мире, иногда, когда происходят интересные события, мы хотим, чтобы выполнялись определенные действия, например «рисование изображения кота при нажатии на кнопку».

Хотите верьте, хотите нет, но компьютеры по-настоящему глупы. Компьютер не имеет представления о том, как нарисовать кота. Поэтому необходимо дать описание, которое будет понятно компьютеру — метод рисования кота. Метод представляет собой набор пошаговых инструкций, которые определяют порядок рисования кота, подобно рецепту.

В последующих главах мы рассмотрим каждый аспект объектно-ориентированного программирования и приведем более детальное описание. Мы также подробно изучим как программировать на языке C#.

Окружающий нас мир можно разделить на различные группы вещей. Назовем их классами.

В качестве одного из явных примеров рассмотрим классы в школе. Детей определенного возраста или с определенными способностями можно объединить в группу и назвать ее классом. Это позволит уровнять детей. Все они будут обучаться примерно одинаково и сдавать одни экзамены.

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

Рассмотрим другой пример: группу всех живых организмов можно объединить в два класса — «растения» и «животные».

Теперь, вернемся к задаче выражения своих мыслей таким образом, чтобы компьютер смог понять то, что мы пытаемся сказать.

В C# описание класса для компьютера может иметь следующий вид:

class Animal

{

}

Из этого небольшого отрывка кода компьютер теперь понимает, что

мы собираемся обсуждать класс объектов

мы назовем этот класс Animal

все описание этого класса будет расположено между фигурными скобками { … }.

В то время как имя класса «Animal» определенно будет нести смысл в программе, выводящей на экран изображения животных или сохраняющей интересные факты о них, также возможны такие классы как «MyPhotoProgram» или «MyGradeCalculator». Итак нужно понимать, что классы совсем не обязательно работают с объектами, существующими в реальном мире — имя классу дается для описания того, с чем он имеет дело.

Компьютеру известно слово «class», которое должно быть написано строчными буквами, но имя класса может быть любым и содержать как прописные, так и строчные буквы. Использование пробелов не допускается.

Для упрощения чтения и понимания код следует писать на отдельных строках, но для компьютера нет принципиальной разницы. Например, код может выглядеть следующим образом:

Строительный блок: Классы

Все программы на языке C# создаются внутри классов. Основная структура класса для компьютера имеет следующий вид: class Animal

{

}

class Animal { }

Немного позже мы расскажем о том, что происходит внутри описания класса (между фигурными скобками). Но сначала мы обсудим объекты.

Каждый класс содержит ряд реальных объектов. Например, в классе объектов «Animal» могут присутствовать определенные существа:

Тетин кот «Барсик»

Корова, увиденная вами однажды, прозвище которой вам неизвестно

Горилла по прозвищу Джереми

и другие объекты.

В предыдущем уроке вы узнали как завести разговор с компьютером о классе животных в общем, но, возможно, в какой-то момент времени вы захотите рассказать что-то об одном или нескольких определенных объектах. Например, что «есть определенное существо в классе животных, которое вы называете Барсиком».

Это можно выразить следующим образом:

Animal Barsik;

Мы написали небольшой отрывок кода, и здесь нужно остановиться чтобы подумать, иначе можно упустить главную мысль. Компьютер понимает следующее: «Этот человек хочет поговорить об объекте в классе «Animal» и назвать его «Barsik». Я не знаю, что такое Barsik, но если человек хочет это так называть, то мне все равно».

Однако нам нужно дополнить приведенный выше код еще одним выражением:

Barsik = new Animal();

Может показаться странным, почему нужно сделать именно так. Но с точки зрения компьютера в этом есть смысл. Подумайте как машина и представьте следующее:

Первое выражение предупреждает компьютер, что вскоре мы попросим его работать с определенным индивидуумом в классе «Animal». Теперь у компьютера появляется возможность проверить свои знания об этом классе. Он просматривает всю программу и ищет описание класса с именем «Animal». Если он не находит такого объекта, то может предупредить вас: «Эй, я не смогу этого сделать!». Если же удается найти нужное описание, он просто продолжит выполнение программы, приняв во внимание, что вы позже попросите его выполнить некоторое действие с объектом класса «Animal» по имени Barsik.

Несколько позже мы добавим второе выражение, которое скажет компьютеру: «Эй, помнишь объект Barsik? Теперь мне нужно выполнить с ним действие. Освободи пространство в голове для размышления об этом животном. Компьютер представляет новый объект «Animal» в своей голове и понимает, что вы говорите о том же объекте (Barsik), упомянутом ранее. Изучив класс «Animal», компьютеру стало кое-что известно о Барсике, и он держит эту информацию наготове в своей голове в надежде на то, что получит от вас дополнительные данные или несколько вопросов о Барсике.

Теперь давайте рассмотрим все три момента и представим как компьютер «думает» о них

Заметьте, в первом блоке мы описываем класс объектов в общем, а в блоках 2 и 3 мы выделили определенный объект в классе Animal.

Строительный блок: Объекты

Объекты — это определенные отдельные элементы некоторого класса.

Класс просто описывает «на что похожи эти объекты» в общем. Таков основной план создания объекта.

class Animal

{

}

Если планируется работать с определенным объектом, необходимо заранеесообщить компьютеру, к какому классу он принадлежит, так чтобы сначала компьютер проверил свои знания об этом классе. Для этого мы указываем имя класса,а затем даем объекту имя на выбор.

Имя класса

Имя объекта

Animal

percyThePorcupine;

Этот процесс называется «объявлением объекта».

Когда же мы будем готовы работать с этим объектом, мы должны попросить компьютер «создать экземпляр» класса. Теперь на основе своих знаний о классе компьютер создает реальный объект, с которым он сможет выполнять действия.

percyThePorcupine = new Animal();

В этом примере «percyThePorcupine» теперь является экземпляром «Animal» или можно сказать, что percyThePorcupine это «объект» типа «Animal». Но в любом случае теперь нам точно известно, что мы говорим об определенном объекте класса «Animal». Это называется «созданием объекта».

Теперь мы знаем, как рассказать об определенном объекте в классе, но поскольку определяемый нами класс достаточно прост (ну да, согласен, он полностью пуст), то с ним совсем неинтересно работать. Итак, в следующем уроке мы добавим некоторые элементы к нашему классу.

Если бы я попросил вас перечислить несколько свойств животных, то скорее всего список был бы следующим:

Вид животного (Kind of animal)

Рост (Height)

Длина (Length)

Количество лап (Number of legs)

Окрас (Color)

Наличие хвоста (Has a tail)

Млекопитающее (Is a mammal)

При рассмотрении свойств этих животных вы можете присвоить значения каждому из них

Kind of animal = «Cat»

Height = 50 cm (большой котяра!)

Length = 110 cm

Number of legs = 4

Color = «Black»

Has tail = true

Is mammal = true

В C# эти свойства обычно называются полями. (Слово «свойства» используется несколько для другой цели, и здесь мы не станем вдаваться в подробности).

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

Значения полей height, width и number of legs являются числами. Как правило, нам необходимо, чтобы компьютер использовал эти значения для выполнения математических операций. Так происходит в большинстве случаев.

Эти поля можно было бы назвать следующим образом: «numberOfBananas», «numberOfPeople» и «numberEachOneGets». Они должны иметь числовой тип, поскольку нам необходимо выполнить с ними некий расчет при помощи математического деления.

Примечание. В языке C#, имена полей не могут содержать пробелы. Используйте простые символы, такие как буквы и числа.

Значения полей kind of animal и color состоять из букв, скрепленных вместе — в этом случае буквы составляют слова «cat» и «black».

При этом стоит отметить, что и строковые поля могут также содержать числа. Например, строковое поле может содержать следующий текст: «Сегодня это уже 17 крокодил, которого я вижу!». В этой строке присутствуют буквы алфавита, пробелы, числа и знаки препинания. Но с числами в строке нельзя выполнять математические операции.

Поле типа has tail всегда будет принимать значение ИСТИНА или ЛОЖЬ (true/false), также как и любые поля типа ДА или НЕТ («yes/no»).

Каждый «тип» обрабатывается компьютером по-разному, поэтому при определении полей мы должны указывать их тип. В одной программе мы можем определить обработку поля number of legs как строки с буквами, поскольку нас не интересуют математические операции с этим свойством, в то время как в другом случае может потребоваться использование такого поля как числового, так как нам понадобится узнать сколько конечностей у 500 таких объектов.

Тип «String» (строка)

Чтобы сообщить компьютеру, что некое свойство нужно рассматривать как строку букв, необходимо просто дополнить код следующим образом:

string kindOfAnimal;

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

Числовые типы

Чтобы сообщить компьютеру, что значение поля нужно рассматривать как число, необходимо выбрать один из нескольких числовых типов, известных в языке C#. Наиболее распространенный из них — integer. Из курса математики вы должны знать, что это не что иное как целое число, которое может быть отрицательным, положительным или нулем.

Простой способ дать компьютеру понять, что значение поля должно быть целым числом, следующий:

Int numberOfLegs;

А так будет думать наш цифровой друг...

Тип «Boolean» (логическое значение)

Если вам известно, что некоторое поле будет всегда принимать значение «true» или «false» и ничего кроме этих значений, то использование поля типа «true/false» в C# может оказаться полезным. У такого типа поля достаточно странное название (Boolean) по имени математика Джорджа Буля, но на самом деле это самый простой из всех типов.

Чтобы сообщить компьютеру, что поле «hasTail» должно принимать значения «true/false», используйте следующий код:

bool hasTail;

Машина будет думать следующим образом.

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

Добавление полей в класс

Ранее, когда мы сообщили компьютеру о классе животных, мы просто назвали класс «Animal», включили в код фигурные скобки и пообещали, что позже расскажем о нем больше, а точнее о том, что находится внутри него:

class Animal

{

...

}

Ну что же, теперь мы готовы к этому. Давайте добавим несколько полей в определение класса.

class Animal

{

string kindOfAnimal;

string name;

int numberOfLegs;

int height;

int length;

string color;

bool hasTail;

bool isMammal;

bool spellingCorrect;

}

(Чтобы код был аккуратным и легкочитаемым, обычно создаются отступы полей, как показано выше. Для этого используйте клавишу TAB на клавиатуре. Можно также выделить несколько строк и сразу создать отступы при помощи клавиши TAB.)

Использование полей с определенными объектами

Итак, теперь мы объяснили компьютеру, что ВСЕ объекты класса «Animal» имеют эти поля. Теперь давайте попросим компьютер создать экземпляр, представляющий определенный объект класса «Animal» (как мы делали это в предыдущей главе) и сообщим компьютеру некоторую информацию об этом определенном объекте, присвоив значения каждому полю.

Animal Barsik;

Barsik = new Animal();

Barsik.kindOfAnimal = "Cat";

Barsik.name = "Кот Барсик";

Barsik.numberOfLegs = 4;

Barsik.height = 50;

Barsik.length = 110;

Barsik.color = "Black";

Barsik.hasTail = true;

Barsik.isMammal = true;

Обратите внимание, что значение строковых полей всегда заключается в кавычки (""), но только не значения других типов полей. В конце каждого выражения ставится точка с запятой (;).

На данном этапе стоит упомянуть, что выбранное нами имя объекта «Barsik» не несет никакого эмоционального значения для компьютера. Он бы также легко работал с объектом, если бы мы заменили все имена «Barsik» на «X» или любое другое имя на выбор:

Animal X;

X = new Animal();

X.kindOfAnimal = "Cat";

X.height = 50;

X.length = 110;

X.color = "Black";

X.hasTail = true;

X.isMammal = true;

Хотя поля могут располагаться на границе страницы, считается хорошей привычкой придерживаться отступов при помощи табуляции от правого края, которые можно создать при помощи клавиши TAB на клавиатуре. Это упрощает чтение кода.

Поля всегда имеют определенный тип. Существует много различных допустимых типов, вот описание некоторых наиболее распространенных из них:

Строительный блок: Поля

Обычно в классе присутствует одно или несколько полей, которые позволяют описывать определенные черты такого класса. class SchoolKid

{

string firstName;

string lastname;

int age;

bool isWideAwake;

}

Тип

Его значение

Примеры значений.

string

Данный тип поля в основном используется для слов и предложений, состоящих из «связанных» букв алфавита и некоторых других символов

«Sam»

«Eight-legged Octopus»

«Girls are too clever to fall out of their prams»

int

Сокращение от слова «integer», представляющее целое число.

328

28000

-520

bool

Сокращение от слова «boolean», которое в принципе означает «true/false»

true

false

При определении поля в программе необходимо указать его тип и имя:

string lastname;

Обозначение типа должно быть известно компьютеру. Указанные выше основные типы (как int) пишутся строчными буквами, однако некоторые типы могут содержать прописные буквы.

В качестве имени поля можно использовать любое слово, например «VsegdaNacheku» с сочетанием заглавных и строчных букв. Использование пробелов не допускается.

При работе с определенным объектом, полям обычно присваиваются значения, которые помогают описывать объект. Если, например, у нас есть объект с именем schoolKid, то его полям можно было бы присвоить следующие значения:

schoolKid.firstName = “Jiminy”;

schoolKid.age = 13;

Имя объекта и имя поля разделяются точкой (.).

Итак, schoolKid.firstName = "Jiminy" означает «значение "Jiminy" подставить в поле firstName объекта schoolKid».

Закрытые, защищенные и открытые поля

При первом изучении языка C# этот раздел не будет настолько важным, но в дальнейшем вам могут встречаться слова «private», «protected» и «public» и вы захотите узнать их значение. Давайте обсудим этот вопрос.

class Animal

{

string kindOfAnimal;

string name;

int numberOfLegs;

int height;

int length;

string color;

bool hasTail;

bool isMammal;

bool spellingCorrect;

}

class MyTestClass

{

}

Объекты можно брать из одного класса, такого как MyTestClass выше, и говорить об объектах в другом классе, таком как Animal.

При объявлении полей так, как показано выше, мы можем решить, должны ли другие классы иметь доступ к ним или нет. Иногда очень важно делать поля закрытыми (private), например потому что другой класс может помещать неверные значения в поля и нарушать работу программы. Использование полей «private», «protected» и «public» означает насколько безопасным будет наш класс.

Обратите внимание на различные уровни защищенности детей в семьей, как показано на рисунке выше. Малютка Света закрыта (private) в комнате — ее не выпускают из дома и она имеет наиболее высокий уровень защиты. С ней могут общаться люди, обладающие наибольшим доверием. Борис может находиться как на переднем, так и заднем дворе, но он по-прежнему в некоторой степени защищен (protected). Толя, старший ребенок, является открытым (public) для других и любой желающий может общаться с ним.

Итак, в начало объявления поля мы можем добавить следующее слово:

class Animal

{

public string kindOfAnimal;

public string name;

public int numberOfLegs;

public int height;

public int length;

public string color;

bool hasTail;

protected bool isMammal;

private bool spellingCorrect;

}

Вы может поинтересоваться, а что если мы не станем включать эти слова. В этом случае компьютер молча воспринимает код, как если бы в начале объявления было написано слово «private», поскольку «private» задается по умолчанию. Поэтому поле hasTail автоматически становится закрытым (private).

Что означают эти слова?

Private означает, что «объекты только этого класса могут обращаться к данному полю»

Public означает, что «объекты любого класса могут обращаться к этому полю»

Protected означает, что «только объекты тесно связанных классов могут обращаться к полю»

Следующие примеры двух классов демонстрируют описанный принцип полей public и private . Мы не станем далее обсуждать поля типа protected. Дополнительные сведения о них можно получить в справке Visual C# Express.

Как и ранее, мы сначала определяем несколько закрытых и открытых полей в классе «Animal» и затем пытаемся обратиться к ним из класса «Zoo».

class Animal

{

public string kindOfAnimal;

public string name;

public int numberOfLegs;

public int height;

public int length;

public string color;

bool hasTail;

protected bool isMammal;

private bool spellingCorrect;

}

class Zoo

{

Animal a = new Animal ();

// Следующая строка будет выполнена успешно, поскольку классу «Zoo» разрешено

// обращаться к открытым полям в классе «Animal»

a.kindOfAnimal = “Kangaroo”;

// Обе следующие строки НЕ будут выполнены, поскольку классу «Zoo»

// не разрешено обращаться к закрытым или защищенным полям

a.isMammal = false; // Попытка обращения к защищенному методу

a.spellingCorrect = true; // Попытка обращения к закрытому методу

}

Программы были бы достаточно бесполезными, если бы позволяли только описывать объекты. Безусловно, мы хотим, чтобы они кроме прочего выполняли некоторые действия.

Выводили слова на экран

Решали задачи

Копировали данные с веб-узла

Регулировали яркость фотографии

… и могли выполнять еще тысячи операций

А теперь вспомните уроки, на которых вас учили сложению чисел. Вероятней всего, сначала вас учили тому КАК складывать числа, возможно, пошагово описывая порядок действий. Другими словами, в первую очередь вас учили МЕТОДУ решения подобного типа задачи. Метод представляет собой набор пошаговых инструкций, поясняющих порядок выполнения действий.

Теперь, когда вам известен метод решения задач определенного типа, вы сможете решить любые поставленные перед вами задачи, следуя ему.

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

В языке C# метод представлен отрывком кода с описанием порядка выполнения определенных действий. Когда впоследствии мы вызываем его, компьютер читает код и выполняет в точности то, что мы написали.

Простой метод для компьютера может иметь следующий вид:

void SayHello()

{

}

Но метод не имеет смысла, если он ничего не делает, поэтому давайте дополним код между фигурными скобками.

void SayHello()

{

Console.WriteLine("Hello");

}

(Чтобы придать коду аккуратный вид, необходимо создать отступы в методе при помощи клавиши TAB)

Если сейчас вызвать этот метод, то на экран будет выведено слово «Hello». Это не слишком сложная задача, поэтому и метод довольно прост.

Что означает VOID?

Странное слово «void» в приведенном выше примере может несколько озадачить и вы можете поинтересоваться зачем вообще мы его использовали. Давайте вкратце рассмотрим его. Просто подумайте о своем любимом фильме о космических путешествиях: представьте безграничное, пустое пространство во вселенной. Void означает «ничего».

Использование слова «void» перед именем метода означает, что когда завершается его выполнение, возвращается пустое значение, то есть ничего не возвращается. Это не значит, что метод не выполняет никаких действий, а скорее то, что по завершении отведенной операции он никаких значений не возвращает. В приведенном выше примере метода «SayHello» нам это отлично подходит, поскольку после написания слова «Hello» возвращать ничего не нужно. Вот и все, что нужно было сделать.

Вы сможете лучше понять смысл этого слова, когда мы будем рассматривать случаи, где метод должен будет возвращать некоторый результат. Мы рассмотрим подобный пример немного позже.

Вызов метода

Написав приведенный выше код, мы научили компьютер КАК выводить приветствие на экран, но фактически мы не сказали, что это нужно сделать.

Это можно сравнить с тем, как ваш учитель учит вас складывать числа и вы записываете метод, но фактически вас не просят вычислять какую-либо определенную сумму.

Чтобы заставить компьютер выполнить действие, нужно вызвать метод. Для этого необходимо просто написать имя метода с круглыми скобками:

SayHello();

Когда компьютер встречает эту строку, он сам не знает как обрабатывать команду, поэтому лихорадочно начинает искать написанный вами метод с именем «SayHello». Если ему удается найти такой метод, он быстро считывает каждую строку в нем, выполняя все написанное вами.

Затем он возвращается, и с чувством гордости от того, что сделал, получает вашу благодарность.

Символ плюса (+) служит для слияния строк друг с другом и напоминает, что текстовые символы заключаются в кавычки (“”), а значения переменных — нет. Двойная косая черта (//) заставляет компьютер пропускать весь текст в строке. Она служит для включения комментариев и примечаний в код для чтения человеком. Слово "this» относится к «тому объекту, о котором идет речь". Так «this.name» относится к полю name текущего объекта (в приведенном ниже примере это «Jiminy»). Для включения метода в действие необходимо указать его имя со скобками в определенном месте программы.

Когда встречается строка ShowFullName, компьютер возвращается и находит метод с указанным именем и выполняет код, написанный в нем шаг за шагом.

Строительный блок: Объявление и вызов метода

Чаще всего в классе присутствует один или несколько методов. Они выполняют определенные действия. Методами они называются потому, что именно в них описывается метод выполнения действий: пошаговые инструкции, поясняющие порядок опреаций. class Person

{

// Поля

public string firstName;

public string lastName;

// Метод

public void ShowFullName()

{

Console.WriteLine("Name is " + this.firstName + " " + this.lastName);

}

}

Person Jiminy;

Jiminy = new Person();

Jiminy.firstName = "Jiminy";

Jiminy.lastName = "Cricket";

Jiminy.ShowFullName();

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

Представим, что вам потребовалось, чтобы компьютер вывел на экран следующий текст:

Hello Jo

Hello Sam

Hello You

Вот один способ, как это сделать: можно было бы написать отдельный метод для каждого случая:

void WriteHelloJo()

{

Console.WriteLine(“Hello Jo”);

}

void WriteHelloSam()

{

Console.WriteLine(“Hello Sam”);

}

void WriteHelloYou()

{

Console.WriteLine(“Hello You”);

}

и затем вызвать их следующим образом:

WriteHelloJo();

WriteHelloSam();

WriteHelloYou();

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

В этом случае можно написать следующий метод:

void WriteHello( string someName )

{

Console.WriteLine( “Hello ” + someName );

}

и затем вызвать метод следующим образом:

WriteHello( “Jo” );

WriteHello( “Sam” );

WriteHello( “You” );

Как видно, этот код позволяет сократить как занимаемое пространство, так и усилия. Нужно всегда стараться делать код как можно более кратким. По большому счету, чем короче программа, тем умнее программист.

При написании метода подобным «умным» образом,

void WriteHello( string someName )

{

Console.WriteLine( “Hello ” + someName );

}

мы фактически говорим: «Каждый раз при вызове этого метода я буду подставлять строку символов с неким именем. Любая подставляемая строка должна выводиться после слова «Hello».

Код в скобках (string someName) называется параметром. Параметр позволяет подставлять значение в метод при его вызове.

Когда вас обучали сложению чисел, учитель не рассказывал о каждой возможности, он просто научил вас методу и затем задал вам разные задачи: «Сложите 2 и 5. Теперь сложите 7 и 3». Это похоже на то, как если бы учитель изложил вам метод сложения чисел и подставлял каждый раз разные параметры. Неважно, какие это были бы параметры, вы бы смогли найти ответ, потому что знали бы метод.

Для компьютера не имеет значения, какое имя вы присвоите параметру, важно чтобы оно было единым при использовании во всем методе. Например, следующий код будет выполнен правильно:

void WriteHello( string x )

{

Console.WriteLine( “Hello ” + x );

}

А этот — нет:

void WriteHello( string someName )

{

Console.WriteLine( “Hello ” + someBodysName );

}

Можете найти ошибку? Параметры «someName» и «someBodysName» отличаются — это запутает нашего «электронного» друга и он «разгневается».

Кроме того, можно на полных правах использовать более одного параметра в методе. Для этого их нужно просто разделить запятыми:

void WriteHello( string firstName, string lastName )

{

Console.WriteLine( “Hello ” + firstName + “ ” + lastName );

}

Но затем при вызове метода важно подставить правильное количество значений

WriteHello( “Jiminy”, “Cricket” );

В данном случае на экран будет выведен текст «Hello Jiminy Cricket».

Отправка неверных типов параметров

Представьте, что когда вы впервые изучали сложение чисел, ваш учитель неожиданного задал вам такую задачу: «Сложите число 5 и цветок».

Что бы вы стали делать? Наверное ответили бы, что цветок это не число и сложение невозможно. Правильно.

Подобным образом компьютеру не понравится, если вы укажите значение неверного типа. Такая ошибка встречается часто среди программистов. Поэтому если что-то идет не так, вернитесь и убедитесь, что указываемые вами значения имеют тип, соответствующий определенному в методе.

А потом, каждый раз при вызове метода мы должны убедиться, что подставляем правильный тип значений в эти параметры. В приведенном ниже примере мы подставляем два целых числа, так как параметры метода «LuckyNumber» были определены как целые числа.

Строительный блок: Параметры

Чтобы подставить значения в метод, необходимо определить в нем параметры: class Person

{

// Поля

string firstName;

string lastName;

// Метод

public void LuckyNumber( int numberOfTeeth, int age )

{

Console.WriteLine( “Счастливое число “ + numberOfTeeth * age );

}

}

Person jiminy;

jiminy= new Person();

jiminy.LuckyNumber(24, 14);

Приводимые до сих пор методы выводили некий текст на экран и затем просто возвращались назад к строке, вызвавшей их, как бы говоря: «Свое дело я сделал. Вернулся в исходную точку». Однако, иногда может возникать необходимость возврата некоторого значения в строку, из которой этот метод был вызван.

Приведем пример. Мы напишем метод, который будет выполнять поиск количества конечностей указанного животного и затем отправлять полученное число туда, откуда он был вызван.

Далее определяется порядок создания метода. Следует помнить, что метод это часть, в которой мы учим компьютер КАК выполнять определенное действие, записывая последовательность операций. Сначала я напишу то, чего хочу добиться от компьютера на русском языке, а затем на C#:

Если животное, о котором мы говорим — слон, то number of legs = 4.

В ином случае, если животное, о котором мы говорим — индейка, то number of legs = 2.

В ином случае, если животное, о котором мы говорим — устрица, то number of legs = 1.

В ином случае, если мы говорим о каких-либо других животных, то number of legs = 0.

int NumberOfLegs( string animalName )

{

if ( animalName == “слон” ) // Если название животного — слон

{

// Возвращаемое значение 4

return 4;

}

else if ( animalName == “индейка" ) // В ином случае, если животное — индейка

{

// Возвращаемое значение 2

return 2;

}

else if ( animalName == “устрица" ) // В ином случае, если животное — устрица

{

// Возвращаемое значение 1

return 1;

}

Else // В ином случае (при всех других условиях)

{

// Возвращаемое значение 0

return 0;

}

}

и затем мы могли бы вызвать метод: Вызовем его дважды:

1. int i; //Создание переменной «i» целочисленного типа для хранения значения числа конечностей

2. i = NumberOfLegs(“индейка”); //Теперь i = 2 из метода NumberOfLegs выше

3. Console.WriteLine(“У индейки ” + i + " конечностей");

4. i = NumberOfLegs(“обезьяна”); //Теперь i = 0 из метода NumberOfLegs выше

5. Console.WriteLine(“У обезьяны ” + i + " конечностей");

По строке 3 на экран выводится текст «У индейки 2 конечностей», а по строке 5 — «У обезьяны 0 конечностей". Итак, метод возвращает значение, которое можно включить непосредственно в строку кода, откуда был вызван метод.

Почему мы определили метод именно так?

int NumberOfLegs( string animalName )

{

...

}

а не вот так:

void NumberOfLegs( string animalName )

{

...

}

или таким образом:

string NumberOfLegs( string animalName )

{

...

}

А сделали так мы именно потому, что нам необходимо, чтобы метод возвращал целое число в данном случае, а не «пустое» значение (void), не строку букв, а именно целое число. А для работы с целыми числами используется тип данных «Integer» или «int» в сокращенном варианте.

При написании метода мы всегда указываем тип данных, возвращаемых этим методом. Если нет необходимости возвращать значение, мы используем «void» для возврата пустого значения.