Учимся общаться с компьютером
Добавление полей в класс
Ранее, когда мы знакомили компьютер с классом животных, то просто дали классу название – Animal, добавили в код фигурные скобки и пообещали рассказать о нем больше, а точнее — сообщить о том, что находится внутри него. Запись выглядела так:
class 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;
Еще одно важное замечание. Каждый объект можно рассматривать как коробочку, внутри которой находятся ящички (поля). У двух объектов одного класса коробочки одинаковые, но значения, хранящиеся в ящичках (полях), — разные. Например, два объекта Миша и Гриша имеют поле "Рост", но Миша высокий, а Гриша маленького роста.
Строительный блок: Поля | |
---|---|
Обычно в классе присутствует одно поле или несколько полей, которые позволяют описывать определенные черты объектов этого класса. |
class SchoolKid { string firstName; string lastName; int age; bool isWideAvake; } |
Поля всегда имеют определенный тип. Допустимых типов очень много, вот описание наиболее распространенных из них:
При определении поля в программе необходимо указать его тип и имя:
string lastname;
Обозначение типа должно быть известно компьютеру. Указанные выше основные типы пишутся строчными буквами, однако некоторые могут содержать и прописные буквы.
Давая имя полю, можно использовать любое слово, например, 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; // Попытка обращения к закрытому свойству класса }