1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 48
Текст из файла (страница 48)
КлассыdBalance);257Здесь метод I n i t ()в ы п о л н я е т в с ю р а б о т у , с в я з а н н у ю с к о н с т р у и р о в а н и е м . Однипо р я д у п р и ч и н т а к о й п о д х о д н е д о с т а т о ч н о " к о ш е р н ы й " — не в п о с л е д н ю ю очередь!з а т о г о , ч т о п р и э т о м в ы з ы в а е т с я м е т о д о б ъ е к т а , к о т о р ы й е щ е н е п о л н о с т ь ю постройэто очень опасная игра!К с ч а с т ь ю , т а к о й п о д х о д н е я в л я е т с я н е о б х о д и м ы м .
О д и н конструктор«ж е т о б р а щ а т ь с я к другому с и с п о л ь з о в а н и е м к л ю ч е в о г о слова t h i s адующим образом:// B a n k A c c o u n t C o n t r u c t o r s A n d T h i s//несколькими конструкторамиusingSystem;namespace-банковскийсчетсBankAccountContructorsAndFunction{usingSystem;publicclassProgram{public{s t a t i cvoidMain(string[]args)// Создание б а н к о в с к о г о с ч е т а с корректными//значениямиBankAccount bal= new B a n k A c c o u n t ( ) ;Console.WriteLine(bal.GetString());начальнымиBankAccount ba2= new B a n k A c c o u n t ( 1 0 0 ) ;Console.WriteLine(ba2.GetString());BankAccount ba3= new B a n k A c c o u n t ( 1 2 3 4 ,Console.WriteLine(ba3.GetString());//Ожидаем п о д т в е р ж д е н и япользователяConsole.WriteLine("Нажмите <Enter> для"завершения200);"программы.+..").;Console.Read();}// BankAccount- банковскийpublicclassBankAccountсчет{// Первый номер с ч е т а — 1000;номера счетов//назначаетсяпоследовательноs t a t i c i n t nNextAccountNumber = 1000;// Номер с ч е т а и е г оintnAccountNumber;doubledBalance;//////258балансВызываем к о н с т р у к т о р с наибольшимаргументов,передавая значения поотсутствующихпараметровколичествомумолчанию дляЧасть IV.
Объектно-ориентированное программированpublicBankAccount():this(0,0){}publicBankAccount(doubledlnitialBalance):this(0,dlnitialBalance){}//Конструкторснаибольшимколичествомаргументов// выполняет всю р а б о т уpublic B a n k A c c o u n t ( i n tnlnitialAccountNumber,doubledlnitialBalance){//////ifИгнорируем отрицательные номера с ч е т о в ;нулевоезначение означает,что мы хотим и с п о л ь з о в а т ьочередное свободное значение номера счета( n l n i t i a l A c c o u n t N u m b e r <= 0){nlnitialAccountNumber=++nNextAccountNumber;}nAccountNumber=nlnitialAccountNumber;//Используемif(dlnitialBalanceпереданный<баланс(еслионположителен)0){dlnitialBalance=0;}dBalancepublic=stringdlnitialBalance;GetString(){returnString.Format("#{0}={l:N}",nAccountNumber,dBalance);В этой версии класса B a n k A c c o u n t и м е ю т с я т е ж е т р и в а р и а н т а к о н с т р у к т о р о в , ч т оив предыдущих д е м о н с т р а ц и о н н ы х п р о г р а м м а х .
О д н а к о в м е с т о п о в т о р е н и я н е к о т о р ы хпроверок в каждом к о н с т р у к т о р е б о л е е п р о с т ы е к о н с т р у к т о р ы в ы з ы в а ю т н а и б о л е е сложный и гибкий конструктор с и с п о л ь з о в а н и е м з н а ч е н и й по у м о л ч а н и ю , а в н е м и выполняются все необходимые п р о в е р к и . Н а л и ч и е ф у н к ц и и I n i t () с т а н о в и т с я н е н у ж н ы м .Создание объекта с и с п о л ь з о в а н и е м к о н с т р у к т о р а по у м о л ч а н и ю в к л ю ч а е т в ы з о винструктора B a n k A c c o u n t ( ) :BankAccountbal=newB a n k A c c o u n t () ;Конструктор B a n k A c c o u n t ( )тутжепередает//ПараметровуправлениенетконструкторуBankAccount ( i n t , d o u b l e ) , п е р е д а в а я е м у з н а ч е н и я п о у м о л ч а н и ю 0 и 0.0:public B a n k A c c o u n t ( ):this(0,0){}Поскольку т е л о к о н с т р у к т о р а п у с т о е , в е с ь к о н с т р у к т о р м о ж н о с м е л о записывать в о д н у с т р о к у .Глава 11.
Классы259П о с л е в ы п о л н е н и я о с н о в н о г о к о н с т р у к т о р а с д в у м я п а р а м е т р а м и управление возвращ а е т с я к о н с т р у к т о р у по у м о л ч а н и ю , т е л о к о т о р о г о в д а н н о м с л у ч а е с о в е р ш е н н о пустоеС о з д а н и е б а н к о в с к о г о с ч е т а с н е н у л е в ы м б а л а н с о м и н о м е р о м с ч е т а по умолчаниюосуществляется следующим образом:publicBankAccount(doubled):this(0,d){}Н е в о з м о ж н о создать объект без конструктора какого-либо вида.
Если вы определитес о б с т в е н н ы й к о н с т р у к т о р , С# б у д е т р а б о т а т ь т о л ь к о с н и м . О б ъ е д и н я я э т и два фактм о ж н о создать класс, который может быть инстанцирован только локально.Н а п р и м е р , с о з д а т ь о б ъ е к т B a n k A c c o u n t , е с л и к о н с т р у к т о р о б ъ я в л е н как i n t e r n a l( п о к а з а н п о л у ж и р н ы м ш р и ф т о м в п р и в е д е н н о м д а л е е и с х о д н о м т е к с т е ) , могут т аметоды, определенные в том же модуле, что и B a n k A c c o u n t .// BankAccount- моделированиеpublicclassBankAccountпростейшегобанковского// Номера б а н к о в с к и х с ч е т о в н а ч и н а ю т с я с 1000// назначаются п о с л е д о в а т е л ь н о в возрастающемs t a t i c i n t nNextAccountNumber = 1000;// Для каждого с ч е т а п о д д е р ж и в а ю т с я е г о номерintnAccountNumber;doubledBalance;счета'ипорядкеибалансinternal BankAccount() // Конструктор{nAccountNumberdBalance==++nNextAccountNumber;0;}publicstringGetStringO{return260String.Format("#{0}={l:N}",nAccountNumber,dBalance);Часть IV.
Объектно-ориентированное программироваГлава 12НаследованиеОпределение о д н о г о к л а с с а п о с р е д с т в о м д р у г о г о , б о л е е ф у н д а м е н т а л ь н о г оРазница м е ж д у " я в л я е т с я " и " с о д е р ж и т "Изменение к л а с с а о б ъ е к т аПостроение с т а т и ч е с к и х ч л е н о в и ч л е н о в к л а с с о вВключение к о н с т р у к т о р о в в и е р а р х и ю н а с л е д о в а н и яВызов к о н с т р у к т о р а б а з о в о г о к л а с с абъектно-ориентированноепрограммированиеоснованонатрехпринципах:управления д о с т у п о м ( и н к а п с у л я ц и я ) , н а с л е д о в а н и я д р у г и х к л а с с о в и в о з м о ж н о сти соответствующего о т к л и к а ( п о л и м о р ф и з м ) .Наследование — р а с п р о с т р а н е н н а я к о н ц е п ц и я .
Я — ч е л о в е к ( н е с ч и т а я р а н н е г о у т р а ,когда я только-только п р о с ы п а ю с ь ) . Я н а с л е д у ю р я д с в о й с т в к л а с с а H u m a n ( ч е л о в е к ) ,такие как з а в и с и м о с т ь от в о з д у х а , е д ы , у м е н и е р а з г о в а р и в а т ь и т.п. К л а с с H u m a n наследует потребность в в о з д у х е , в о д е и е д е от к л а с с а M a m m a l(млекопитающее),а тот,всвою очередь, — от к л а с с а A n i m a l ( ж и в о т н о е ) .Возможность п е р е д а ч и с в о й с т в о ч е н ь в а ж н а . О н а п о з в о л я е т э к о н о м н о о п и с ы в а т ь вещи и концепции. Н а п р и м е р , на в о п р о с р е б е н к а : " Ч т о т а к о е у т к а ? " — е м у м о ж н о ответить: "Это птица, к о т о р а я к р я к а е т " .
Н е з а в и с и м о от т о г о , ч т о вы п о д у м а л и о т а к о м о т в е т е ,он содержит з н а ч и т е л ь н о е к о л и ч е с т в о и н ф о р м а ц и и . Р е б е н о к з н а е т , ч т о т а к о е п т и ц а , а теперь он знает, ч т о в с е то же м о ж н о с к а з а т ь и об у т к е , а к р о м е т о г о , у у т к и и м е е т с я дополнительное с в о й с т в о " к р я к а н ь е " .Объектно-ориентированные я з ы к и п р о г р а м м и р о в а н и я в ы р а ж а ю т о т н о ш е н и е наследования, позволяя о д н о м у к л а с с у н а с л е д о в а т ь д р у г о й , ч т о , в с в о ю о ч е р е д ь , д а е т возможность объектно-ориентированным я з ы к а м г е н е р и р о в а т ь м о д е л и , б о л е е б л и з к и е к реальности, чем модели, г е н е р и р у е м ы е я з ы к а м и , о б ъ е к т н о - о р и е н т и р о в а н н о е п р о г р а м м и р о в а ние не поддерживающими.В приведенной далее демонстрационной программеInheritanceExam-p l e класс S u b c l a s s наследован о т класса B a s e C l a s s .// I n h e r i t a n c e E x a m p l eusing S y s t e m ;-простейшаядемонстрациянаследованияnamespace{InheritanceExamplepublicclassBaseClass{publicintpublicvoidnDataMember;SomeMethodO{Console.WriteLine("SomeMethod()");}}publicclassSubclass:BaseClass{publicvoidSomeOtherMethod(){Console.WriteLine("SomeOtherMethod()");}}publicclassProgram{publics t a t i cvoidMain(string[]args){//Созданиеобъекта базового классаConsole .
WriteLine ("Работас объектомB a s e C l a s s be = new B a s e C l a s s О;be.nDataMember = 1 ;be.SomeMethod();//Создание объекта подклассаConsole.WriteLine("РаботасобъектомS u b c l a s s sc = new S u b c l a s s О;s c . n D a t a M e m b e r = 2;sc.SomeMethod();sc.SomeOtherMethod();базовогокласса:"•подкласса:");//Ожидаем п о д т в е р ж д е н и япользователяConsole.WriteLine("Нажмите <Enter> для " +"завершенияпрограммы...");Console.Read();}Класс B a s e C l a s sопределен как и м е ю щ и й член-данные и простой метод SM e t h o d ( ) .