Свойства объектов
Если бы я попросил вас перечислить несколько свойств животных, то список мог быть следующим:
- Вид животного (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, Length и number of legs являются числами. Как правило, компьютер использует эти значения для выполнения математических операций.
В задаче с бананами поля можно было бы назвать так: numberOfBananas ("количествоБананов"), numberOfPeople ("количествоЛюдей") и numberEachOneGets ("количествоПолучаемоеКаждым"). Они должны иметь числовой тип, поскольку с их помощью мы выполняем некие математические вычисления.
Примечание. В языке C# имена полей не могут содержать пробелы. Используйте в именах только буквы и числа, причем первой всегда ставится буква.
- Поля kindOfAnimal и color относятся к строковому типу. Значением таких полей может быть любой текст. В нашем примере значения задаются словами "cat" и "black", заключенными в кавычки.
Надо отметить, что в строковом поле (в строке) текст может содержать числа. Например, в тексте "Сегодня это уже 17-й крокодил, которого я вижу!" присутствуют буквы, пробелы, числа и знаки препинания, но с числами, находящимися в строке, нельзя выполнять математические операции.
- Поле типа hasTail всегда будет принимать значение ИСТИНА или ЛОЖЬ ( true/false ), точно так же, как любые поля типа ДА или НЕТ ("yes/no"). Такие поля относятся к логическому типу.
Каждый "тип" обрабатывается компьютером особым образом, поэтому при определении полей мы должны указывать их тип. В одной программе мы определим поле numberOfLegs как строку, поскольку мы не планируем выполнять математические операции над этим полем, а в другом случае, когда надо будет узнать, сколько конечностей у 500 одинаковых объектов, может потребоваться использование такого поля в качестве числового.
Тип "String" (строка)
Для того чтобы попросить компьютер рассматривать некое свойство как строку, состоящую из букв, достаточно просто объявить объект следующим образом:
Пока мы не задаем значение в этом поле, а всего лишь сообщаем, с каким типом данных будем работать, и присваиваем полю имя. Поставьте себя на место компьютера и представьте, как бы вы отреагировали, если бы человек написал для вас следующее:
Числовые типы
Извещая компьютер о том, что значение поля нужно рассматривать как число, необходимо выбрать один из нескольких числовых типов, известных в языке C#. Наиболее распространенный — integer. Из курса математики вы должны знать, что это не что иное, как целое число, которое может быть отрицательным, положительным или нулем.
То, что значение поля должно быть целым числом, проще всего сообщается так:
А вот что подумает в этом случае наш цифровой друг:
Тип "Boolean" (логическое значение)
Если вам известно, что некоторое поле будет всегда принимать значения "true" ("истина") или "false" ("ложь") и ничего другого, то использование в C# поля типа "true/false" может оказаться полезным. Это самый простой из всех типов, хотя такие поля носят довольно странное название — булевые (Boolean), по имени математика Джорджа Буля.
Извещая компьютер о том, что поле "hasTail" должно принимать значения "true/false", используйте следующий код:
Машина будет думать следующим образом:
Итак, поля представляют собой элементы информации, позволяющие лучше описать объекты в классе. Они всегда имеют определенный тип.
Добавление полей в класс
Ранее, когда мы знакомили компьютер с классом животных, то просто дали классу название – Animal, добавили в код фигурные скобки и пообещали рассказать о нем больше, а точнее — сообщить о том, что находится внутри него. Запись выглядела так:
А теперь мы готовы добавить несколько полей в определение класса.
class Animal
{
string kindOfAnimal;
string name;
int numberOfLegs;
int height;
int length;
string color;
bool hasTail;
bool isMammal;
bool spellingCorrect;
}
Код должен быть аккуратным и легко читаемым, для чего и создаются отступы полей, показанные выше. Это делается при помощи клавиши 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;
Примечание редактора. То, что компьютер способен обрабатывать любые имена (проблемы не составит даже кот, которого зовут ГЩ12я), не означает, что объекты можно именовать как попало. Имя многое говорит человеку, поэтому крайне важно давать объектам содержательные имена, позволяющие лучше понимать смысл программы.
Еще одно важное замечание. Каждый объект можно рассматривать как коробочку, внутри которой находятся ящички (поля). У двух объектов одного класса коробочки одинаковые, но значения, хранящиеся в ящичках (полях), — разные. Например, два объекта Миша и Гриша имеют поле "Рост", но Миша высокий, а Гриша маленького роста.
Строительный блок: Поля |
Обычно в классе присутствует одно поле или несколько полей, которые позволяют описывать определенные черты объектов этого класса. |
class SchoolKid
{
string firstName;
string lastName;
int age;
bool isWideAvake;
}
|
Поля всегда имеют определенный тип. Допустимых типов очень много, вот описание наиболее распространенных из них:
Тип |
Описание |
Примеры значений |
string |
Строковый тип данных предполагает, что значением поля может быть слово или предложение, состоящее из символов алфавита, цифр, знаков препинания и т.д. |
"Petr" ("Петя")
"Eight-legged Octopus" ("Восьминогий Осьминог")
"Girls are too clever to fall out of their prams" ("Девочки слишком умные, чтобы выпасть из коляски")
|
int |
Числовой тип данных предполагает, что значение поля может быть целым числом.
Название типа – это сокращение от слова "integer"
|
328
28000
-520
|
bool |
Логический тип данных предполагает, что значение поля может быть либо истиной (true), либо ложью (false). Название типа – сокращение от слова "boolean". |
True — истина
False — ложь
|
При определении поля в программе необходимо указать его тип и имя:
Обозначение типа должно быть известно компьютеру. Указанные выше основные типы пишутся строчными буквами, однако некоторые могут содержать и прописные буквы.
Давая имя полю, можно использовать любое слово, например, VsegdaNacheku – здесь сочетаются заглавные и строчные буквы. Обратите внимание: пробелы ставить нельзя.
При работе с определенным объектом полям присваиваются значения, которые помогают описывать объект. Если, например, у нас есть объект с именем schoolKid (Школьник), то его полям можно было бы присвоить следующие значения:
schoolKid.firstName = "Petr";
schoolKid.age = 13;
Имя объекта и имя поля разделяются точкой (.).
Итак, schoolKid.firstName = "Petr" означает следующее: " Petr становится значением поля 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
{
Animal myAnimal;
}
Объекты одного класса могут быть полями в другом классе. Например, в классе MyTestClass появится поле myAnimal, принадлежащее классу 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 – "только объекты классов-наследников могут обращаться к полю". Если построен класс Animal, то другой класс, например, класс Mammal (Млекопитающее), может объявить себя наследником класса Animal.
Следующие примеры двух классов демонстрируют описанный принцип полей 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; // Попытка обращения к закрытому свойству класса
}
|