Класс создается с помощью ключевого слова class. Ниже приведена общая форма определения простого класса, содержащая только переменные экземпляра и методы. class имя_класса { // Объявление переменных экземпляра. доступ тип переменная1; доступ тип переменная2; //... доступ тип переменнаяN; // Объявление методов. доступ возращаемый_тип метод1(параметры) { // тело метода } доступ возращаемый_тип метод2(параметры) { // тело метода } // ... доступ возращаемый_тип методы(параметры) { } }
Обратите внимание на то, что перед каждым объявлением переменной и метода указывается доступ. Это спецификатор доступа, например public, определяющий порядок доступа к данному члену класса. Как упоминалось в главе 2, члены класса мо гут быть как закрытыми (private) в пределах класса, так открытыми (public), т.e. бо лее доступными. Спецификатор доступа определяет тип разрешенного доступа. Ука зывать спецификатор доступа не обязательно, но если он отсутствует, то объявляемый член считается закрытым в пределах класса. Члены с закрытым доступом могут ис пользоваться только другими членами их класса. В примерах программ, приведенных в этой главе, все члены, за исключением метода Main, обозначаются как открытые (public). Это означает, что их можно использовать во всех остальных фрагментах кода — даже в тех, что определены за пределами класса. Мы еще вернемся к обсужде нию спецификаторов доступа в главе 8.
ПРИМЕЧАНИЕ Помимо спецификатора доступа, в объявлении члена класса могут также присутствовать один или несколько модификаторов. О модификаторах речь пойдет далее в этой главе.
Несмотря на отсутствие соответствующего правила в синтаксисе С#, правильно сконструированный класс должен определять одну и только одну логическую сущ ность. Например, класс, в котором хранятся Ф.И.О. и номера телефонов, обычно не со держит сведения о фондовом рынке, среднем уровне осадков, циклах солнечных пятен или другую информацию, не связанную с перечисляемыми фамилиями. Таким об разом, в правильно сконструированном классе должна быть сгруппирована логически связанная информация. Если же в один и тот же класс помещается логически несвя занная информация, то структурированность кода быстро нарушается.
Классы, использовавшиеся в приведенных ранее примерах программ, содержали только один метод: Main. Но в представленной выше общей форме определения класса метод Main не указывается. Этот метод требуется указывать в классе лишь в том случае, если программа начинается с данного класса. Определение класса
Для того чтобы продемонстрировать классы на конкретных примерах, разработаем постепенно класс, инкапсулирующий информацию о зданиях, в том числе о домах, складских помещениях, учреждениях и т.д. В этом классе (назовем его Building) бу дут храниться три элемента информации о зданиях: количество этажей, общая пло щадь и количество жильцов.
Ниже приведен первый вариант класса Building. В нем определены три перемен ные экземпляра: Floors, Area и Occupants. Как видите, в классе Building вообще отсутствуют методы. Это означает, что в настоящий момент этот класс состоит только из данных. (Впоследствии в него будут также введены методы.) class Building { public int Floors; // количество этажей public int Area; // общая площадь здания public int Occupants; // количество жильцов }
Переменные экземпляра, определенные в классе Building, демонстрируют общий порядок объявления переменных экземпляра. Ниже приведена общая форма для объ явления переменных экземпляра: доступ тип имя_переменной;
где доступ обозначает вид доступа; тип — конкретный тип переменной, а имя_пере- менной — имя, присваиваемое переменной. Следовательно, за исключением специфи катора доступа, переменная экземпляра объявляется таким же образом, как и локаль ная переменная. Все переменные объявлены в классе Building с предваряющим их модификатором доступа public. Как пояснялось выше, благодаря этому они стано вятся доступными за пределами класса Building.
Определение class обозначает создание нового типа данных. В данном случае но вый тип данных называется Building. С помощью этого имени могут быть объявлены объекты типа Building. Не следует, однако, забывать, что объявление class лишь описывает тип, но не создает конкретный объект. Следовательно, в приведенном выше фрагменте кода объекты типа Building не создаются.
Для того чтобы создать конкретный объект типа Building, придется воспользо ваться следующим оператором. Building house = new Building; // создать объект типа Building
После выполнения этого оператора объект house станет экземпляром класса Building, т.е. обретет "физическую" реальность. Не обращайте пока что внимание на отдельные составляющие данного оператора.