1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 21
Текст из файла (страница 21)
Например, приложение, работающее со списками студентов,должно хранить разнотипную информацию о них — имя, год рождения, успеваемостьи т.п. Логически рассуждая, имя студента может иметь тип s t r i n g , год рождения —int или s h o r t , средний б а л л — d o u b l e . Такой программе необходима возможностьобъединить эти разнотипные переменные в единую структуру под именем S t u d e n t .К счастью, в С# имеется структура, известная как класс, которая предназначена для облегчения группирования таких разнотипных переменных.В других случаях программам требуются наборы однотипных объектов.
Возьмем дляпримера программу, которая должна усреднять успеваемость. Тип d o u b l e — естественный кандидат для представления индивидуальной успеваемости студента, но для тогочтобы представлять успеваемость группы студентов, необходим тип, который являетсянабором d o u b l e . Для таких целей в С# существуют массивы.И наконец, реальной программе для работы с информацией о студентах могут понадобиться как классы, так и массивы, причем объединенные в одно целое — массив студентов.
С# позволяет получить желаемое.КлассыКласс представляет собой объединение разнотипных данных и функций, логическиорганизованных в единое целое. С# предоставляет полную свободу при создании классов, но хорошо спроектированные классы призваны представлять концепции.Аналитик скорее всего скажет, что "класс отображает концепцию из предметной области задачи в программу".
Предположим, например, что ваша з а д а ч а — построенияимитатора дорожного движения, который должен смоделировать улицы, перекресткашоссе и т.п.Любое описание такой задачи должно включать термин транспортное средствоТранспортные средства обладают определенной максимальной скоростью движенииимеют вес, и некоторые из них оснащены прицепами. Таким образом, имитатор дорожного движения должен включать класс V e h i c l e , у которого должны иметься свойствнаподобие d T o p S p e e d , n W e i g h t и b T r a i l e r .Поскольку классы — центральная концепция в программировании на С#, они буигораздо детальнее рассмотрены в главах части IV, "Объектно-ориентированноепрограммирование"; здесь же описаны только азы.Определение классаПример класса V e h i c l e может выглядеть следующим образом:publicclassVehicle{publicpublicpublicpublics t r i n g sModel;s t r i n g sManufacturer;i n t nNumOfDoors;i n t nNumOfWheels;////////Название моделиПроизводительКоличество дверейКоличество колес}Определение класса начинается словами p u b l i cc l a s s , за которыми идет имякласса (в данном случае — V e h i c l e ) .Как и все имена в С#, имена классов чувствительны к регистру.
С# не имеяникаких правил для именования классов, но неофициальная традиция гласитчто имена классов начинаются с прописной буквы.За именем класса следует пара фигурных скобок, внутри которых могут быть несколько членов (либо ни одного). Члены класса представляют собой переменные, образующие часть класса.
В данном примере класс V e h i c l e начинается с члена s t r i n gs M o d e l , который содержит название модели транспортного средства. Второй член вэтом примере — s t r i n gsManuf a c t u r e r , а последние два члена содержат количест-во дверей и колес в транспортном средстве.Как и в случае обычных переменных, делайте имена членов максимально информативными. Хотя я и добавил к именам членов комментарии, они не являются обязательными с точки зрения С#. Обо всем должны говорить имена переменных.Модификатор p u b l i c перед именем класса делает класс доступным для всей про-!граммы. Аналогично, модификаторы p u b l i c перед именами членов также делают ихдоступными для всей программы.
Возможны и другие модификаторы, но более подробно о доступности речь пойдет в главе 11, "Классы".Определение класса должно описывать свойства объектов решаемой задачи. Сделатьэто прямо сейчас вам будет немного сложновато, поскольку вы не знаете, в чем именносостоит задача, так что просто следите за ходом изложения.116Часть III. Объектно-основанное программированиеГлав,Что т а к о е о б ъ е к тОбъект класса объявляется аналогично встроенным объектам С#, но не идентично им.Термин объект используется для обозначения "вещей".
Да, это не слишкомполезное определение, так что приведем несколько примеров. Переменная типаi n t является объектом i n t . Автомобиль является объектом V e h i c l e .Вот фрагмент кода, создающий автомобиль, являющийся объектом V e h i c l e :Vehicle myCar;myCar = new V e h i c l e () ;В первой строке объявлена переменная myCar типа V e h i c l e , так же как вы можетеобъявить переменную n S o m e t h i n g класса i n t (да, класс является типом, и все объектыС# определяются как классы).
Команда new V e h i c l e ()создает конкретный объекттипа V e h i c l e и сохраняет его местоположение в переменной myCar. Оператор n e w("новый") не имеет ничего общего с возрастом автомобиля — он просто выделяет новыйблок памяти, в котором ваша программа может хранить свойства автомобиля myCar.В терминах С# m y C a r — это объект класса V e h i c l e . Можно также сказать,что m y C a r — экземпляр класса V e h i c l e . В данном контексте экземпляр(instance) означает "пример" или "один из". Можно использовать этот термини как глагол, и говорить об инстащировании V e h i c l e — это именно то, чтоделает оператор new.Сравните объявление myCar с объявлением переменной num типа i n t :int num;num = 1;В первой строке объявлена переменная num типа i n t , а во второй созданной переменной присваивается значение типа i n t , которое вносится в память по месту расположения переменной num.Переменная встроенного типа num и объект my С а г хранятся в памяти поразному.
Константа 1 не занимает память, поскольку и процессор, и С# знают,что такое 1. Но процессор понятия не имеет о такой концепции, как V e h i c l e .Выражениеnew V e h i c l eвыделяетпамять,необходимуюдляописаниятранспортного средства, понятного процессору, С#, и вообще — всему миру.Доступ к ч л е н а м о б ъ е к т аКаждый объект класса V e h i c l e имеет собственный набор членов. Приведенное далее выражение сохраняет число 1 в члене nNumberOf D o o r s объекта, на который ссылается myCar:myCar. nNumberOf D o o r s = 1;Каждый оператор С# имеет не только значение, но и тип. Объект myCar является объектом типа V e h i c l e . Переменная V e h i c l e .nNumberOf D o o r s имеет тип i n t (вернитесь к определению класса V e h i c l e ) . Константа 1 такжеимеет тип i n t , так что типы константы с правой стороны от оператора присваивания и переменной с левой стороны соответствуют друг другу.Глава 6.
Объединение данных - классы и массивы117Аналогично, в следующем фрагменте кода сохраняются ссылки на строки strinJописывающие модель и производителя myCar:m y C a r . s M a n u f a c t u r e r = "BMW";myCar.sModel = " I s e t t a " ;( I s e t t a — небольшой автомобиль, который производился в 1950-х годах и имел одядверь впереди.)Пример объектно-основанной программыПрограмма V e h i c l e D a t a O n l y очень проста и делает следующее:определяет класс V e h i c l e ;создает объект myCar;указывает свойства myCar;получает значения свойств myCar и выводит их на экран.Вот код программы V e h i c l e D a t a O n l y ://VehicleDataOnly/ / С о з д а е т о б ъ е к т V e h i c l e , з а п о л н я е т е г о члены и н ф о р м а ц и е й ,// в в о д и м о й с к л а в и а т у р ы , и выводит ее на э к р а нusing System;namespaceVehicleDataOnly{publicclassVehicle{publicpublicpublicpublics t r i n g sModel;s t r i n g sManufacturer;i n t nNumOfDoors,i n t nNumOf Wheels,-/ / Модель// Производитель// Количество дверей// Количество колес}publicclassProgram{/ / Начало программыs t a t i c voidMain(string[] args){/ / Приглашение п о л ь з о в а т е л юC o n s o l e .
W r i t e L i n e ( " В в е д и т е информациюомашине");// Создание экземпляра V e h i c l eVehiclemyCar = new V e h i c l e ( ) , / / В в о д информации д л я ч л е н о в к л а с с аConsole.Write("Модель = " ) ;string s = Console.ReadLine();myCar.sModel = s;118Часть III. Объектно-основанное программировав/ / Можно п р и с в а и в а т ь з н а ч е н и я н е п о с р е д с т в е н н оConsole.Write("Производитель = " ) ;myCar.sManufacturer= Console.ReadLineО;/ / Остальные данные имеют тип i n tConsole.Write("Количество дверей = " ) ;s = Console.ReadLine();myCar.nNumOfDoors= Convert.ToInt32(s),Console.Write("Количество колес = " ) ;s = Console.ReadLine();myCar.nNumOfWheels = C o n v e r t .
T o I n t 3 2 ( s ) ;// Вывод п о л у ч е н н о й информацииC o n s o l e . W r i t e L i n e ( " \ п В а ш а машина: " ) ;Console.WriteLine(myCar.sManufacturer+ " " +myCar.sModel);C o n s o l e . W r i t e L i n e ( " c " + myCar.nNumOfDoors +" дверями, "+"на " + m y C a r . n N u m O f W h e e l s+" колесах") ;/ / Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яC o n s o l e . W r i t e L i n e ( " Н а ж м и т е < E n t e r > для " +" з а в е р ш е н и я п р о г р а м м ы . . .
") ;Console.Read();Листинг программы начинается с определения класса V e h i c l e .Определение класса может находиться как до, так и после класса P r o g r a m —это не имеет значения. Однако вам нужно принять какой-то один стиль и следовать ему.Программа создает объект myCar класса V e h i c l e , а затем заполняет все его поляинформацией, вводимой пользователем с клавиатуры. Проверка корректности входныхданных не производится. Затем программа выводит введенные данные на экран в немного ином формате.Вывод этой программы выглядит следующим образом:Введите информацию о машинеМодель= MetropolitanПроизводитель = N a s hКоличество д в е р е й = 2Количество к о л е с= 4Ваша м а ш и н а :Nash M e t r o p o l i t a nс 2 дверями, на 4 к о л е с а хНажмите < E n t e r > д л я з а в е р ш е н и япрограммы...Глава В, Объединение данных - классы и массивы119Вызов R e a d ( ) , в отличие от R e a d L i n e ( ) , оставляет курсор сразу за введен!ной строкой.