1629295403-b876e2087bddebea4bc9666fb2377a02 (846199), страница 52
Текст из файла (страница 52)
Т а к ч т о в ы всегда д о л ж н ыпроверять, н е равен л и результат работы оператора a s ссылке n u l l :SavingsAccountSavingsAccountbankAccountif(SavingsAccount!=as=SavingsAccount;null){//ПродолжаемработусиспользованиемSavingsAccount}/ / В п р о т и в н о м с л у ч а е мы не можем// должны с г е н е р и р о в а т ьсообщениеиспользовать этот объект иоб ошибке с а м о с т о я т е л ь н оК а к о й и з о п е р а т о р о в п р е д п о ч е с т ь ? В о о б щ е г о в о р я , о п е р а т о р a s б о л е е эффективенО н с р а з у в ы п о л н я е т п р е о б р а з о в а н и е , в т о в р е м я к а к о п е р а т о р i s т р е б у е т двух этаповпроверки с его использованием с п о с л е д у ю щ и м преобразованием типа.К с о ж а л е н и ю , as не р а б о т а е т с п е р е м е н н ы м и т и п о в - з н а ч е н и й , т а к что вым о ж е т е п р и м е н я т ь е г о с т а к и м и т и п а м и , к а к i n t , l o n g , d o u b l e и подобныйВ этом случае предпочтительней использовать оператор i s .П р о г р а м м а I n h e r i t a n c e E x a m p l e , с к о т о р о й вы в с т р е ч а л и с ь р а н е е в этой главеприменяет функции I n i t .
. . ()д л я и н и ц и а л и з а ц и и о б ъ е к т о в B a n k A c c o u n t и Saving!s A c c o u n t и п р и в е д е н и я их в к о р р е к т н о е с о с т о я н и е . О с н а щ е н и е э т и х к л а с с о в конструкторами, определенно, правильное решение, хотя и со своими сложностями.Вызов конструктора по умолчанию базового классаК о г д а с о з д а е т с я п о д к л а с с , в с я к и й р а з в ы з ы в а е т с я к о н с т р у к т о р по умолчан и ю б а з о в о г о к л а с с а . К о н с т р у к т о р п о д к л а с с а а в т о м а т и ч е с к и в ы з ы в а е т конс т р у к т о р б а з о в о г о к л а с с а , ч т о в и д н о на п р и м е р е п р и в е д е н н о й д а л е е демонстрационной программы.274Часть IV. Объектно-ориентированное программированl// I n h e r i t i n g A C o n s t r u c t o r - демонстрация автоматического/ / вызоваpingконструкторапоумолчаниюбазовогоклассаSystem;n a m e s р а с еI n h e r i t i n g A C o n s t r u c t o r(public class Program{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 ( ) ;Console.WriteLine("\пСозданиеSubclasssc = new S u b c l a s s ( ) ;BaseClass");объектаSubclass");// Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яConsole.WriteLine("Нажмите <Enter> для " +"завершения программы...");Console.Read();public{classpublicBaseClassBaseClassO{Console.WriteLine("Конструктор BaseClass");{public{classpublicSubclass:BaseClassS u b c l a s s (){Console.WriteLine("КонструкторSubclass");Конструкторы B a s e C l a s s и S u b c l a s s н е д е л а ю т н и ч е г о , к р о м е в ы в о д а с т р о к и н аэкран.
С о з д а н и е о б ъ е к т а B a s e C l a s s п р и в о д и т к в ы з о в у к о н с т р у к т о р а п о у м о л ч а н и юB a s e C l a s s . С о з д а н и е о б ъ е к т а S u b c l a s s п р и в о д и т к в ы з о в у к о н с т р у к т о р а п о умолчанию B a s e C l a s s п е р е д т е м , к а к в ы з ы в а е т с я с о б с т в е н н о к о н с т р у к т о р B a s e C l a s s .Это ясно в и д н о и з в ы в о д а р а с с м о т р е н н о й д е м о н с т р а ц и о н н о й п р о г р а м м ы н а э к р а н .СозданиеобъектаBaseClassКонструкторBaseClassСозданиеобъекта SubclassКонструкторBaseClassКонструкторSubclassНажмите<Enter>длязавершенияпрограммы.
. .Иерархия н а с л е д у е м ы х к л а с с о в в е с ь м а н а п о м и н а е т э т а ж и з д а н и я . К а ж д ы й к л а с с , построенный н а о с н о в е д р у г о г о к л а с с а , п р е д с т а в л я е т с о б о й н о в ы й , в е р х н и й э т а ж . Т о ж е относится и к к о н с т р у к т о р а м к л а с с о в : п р е ж д е ч е м б у д е т в ы з в а н к о н с т р у к т о р в е р х н е г о эта-[пава 12.
Наследование275ж а д л я е г о п о с т р о е н и я , н а д о п о с т р о и т ь н и ж н и й э т а ж . О ч е в и д н а и п р и ч и н а этого: к а ж д ы йк л а с с с а м о т в е ч а е т з а с е б я , а з н а ч и т , п о д к л а с с н е д о л ж е н о т в е ч а т ь з а инициализациюч л е н о в б а з о в о г о к л а с с а . B a s e C l a s s д о л ж е н п о л у ч и т ь в о з м о ж н о с т ь сконструироватьс в о и ч л е н ы д о т о г о , к а к ч л е н ы S u b c l a s s с м о г у т к н и м о б р а т и т ь с я .
Л о ш а д ь нужной с т авить перед телегой...Передача аргументов конструктору базового классаПодкласс вызывает конструктор по у м о л ч а н и ю базового класса, если только не указ а н о и н о е , н а п р и м е р , и з к о н с т р у к т о р а п о д к л а с с а , н е я в л я ю щ е г о с я конструкторому м о л ч а н и ю . В о т н е м н о г о и с п р а в л е н н а я д е м о н с т р а ц и о н н а я п р о г р а м м а , иллюстрируютсказанное:usingSystem;namespaceExample{publicclassProgram{publics t a t i cvoidMain(string[]args)Console.WriteLine("ВызовSubclass()");Subclassscl= new S u b c l a s s ( ) , •Console.WriteLine("\пВызовSubclass(int)");Subclass sc2= new S u b c l a s s ( 0 ) ;// Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яConsole.WriteLine("Нажмите <Enter> для " +"завершения программы...");Console.Read();{p u pb ul ibcl i c c l aBs as s e CB al as se sC( l) a s s{Console.WriteLine("КонструкторpublicBaseClass(intBaseClass(поумолчанию)");i)Console.WriteLine("КонструкторBaseClass( i n t ) " ) ;}public{classpublicSubclass:BaseClassSubclass(){Console.WriteLine("КонструкторpublicSubclass(intSubclass(поумолчанию)")Subclass( i n t ) " ) ;i){Console.WriteLine("Конструктор276Часть IV.
Объектно-ориентированное программированиеВыполнение п р о г р а м м ы п р и в о д и т к с л е д у ю щ е м у в ы в о д у н а э к р а н :ВызовS u b c l a s s ()Конструктор B a s e C l a s s(по умолчанию)Конструктор S u b c l a s s(по умолчанию)ВызовSubclass (int)Конструктор B a s e C l a s s(по умолчанию)Конструктор S u b c l a s s(int)Нажмите < E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы . . .Данная д е м о н с т р а ц и о н н а я п р о г р а м м а с п е р в а с о з д а е т о б ъ е к т по у м о л ч а н и ю . К а к и ожидалось, С # в ы п о л н я е т к о н с т р у к т о р п о у м о л ч а н и ю S u b c l a s s , к о т о р ы й с н а ч а л а п е р е д а е туправление к о н с т р у к т о р у п о у м о л ч а н и ю B a s e C l a s s .
З а т е м п р о г р а м м а с о з д а е т объект,передавая ц е л о ч и с л е н н ы й а р г у м е н т . К а к и п р е д п о л а г а л о с ь , т е п е р ь С# в ы з ы в а е т конструктор S u b c l a s s ( i n t ) .Этот конструктор, в с в о ю очередь, в ы з ы в а е т конструктор по у м о л ч а н и ю B a s e C l a s s , каки в предыдущем п р и м е р е , п о с к о л ь к у н и к а к и е д а н н ы е б а з о в о м у классу не п е р е д а ю т с я .Указание конкретного конструктора базового классаКонструктор п о д к л а с с а м о ж е т в ы з в а т ь о п р е д е л е н н ы й к о н с т р у к т о р б а з о в о г о к л а с с ас использованием к л ю ч е в о г о с л о в а b a s e .Э т а в о з м о ж н о с т ь а н а л о г и ч н а с п о с о б у , к о т о р ы м о д и н к о н с т р у к т о р м о ж е т вызвать другой конструктор того же класса с п р и м е н е н и е м ключевого словаt h i s (см.
главу 11, " К л а с с ы " ) .Рассмотрим, например, следующую демонстрационную программу:// I n v o k e B a s e C o n s t r u c t o r - д е м о н с т р а ц и я т о г о ,как подкласс/ / может в ы з в а т ь к о н с т р у к т о р б а з о в о г о к л а с с а п о с в о е м у// выбору с и с п о л ь з о в а н и е м к л ю ч е в о г о с л о в а b a s eusingSystem;namespaceInvokeBaseConstructor{publicclassBaseClassp{ u b l i cBaseClassOConsole.WriteLine("КонструкторpublicBaseClass(intclassSubclass(поумолчанию)");i)Console.WriteLine("КонструкторpublicBaseClass:BaseClass({0})",i ) ;BaseClass{publicSubclass(){Console.WriteLine("КонструкторГлава 12.
НаследованиеSubclass(поумолчанию)");277}publicSubclass(intil,inti2):base(il){Console.WriteLine("Конструктор Subclass({0},i2){ l } ) " , il,;}}publicclassProgram{publics t a t i cvoidMain(string[]args){Console.WriteLine("ВызовSubclass()");Subclassscl= new S u b c l a s s ( ) ;Console.WriteLine("\пВызовSubclass(1,S u b c l a s s sc2 = new S u b c l a s s ( 1 ,2);2 ) " ) ;// Ожидаем п о д т в е р ж д е н и я п о л ь з о в а т е л яConsole.WriteLine("Нажмите <Enter> для " +"завершения программы...");Console.Read();}}}Вывод программы выглядит следующим образом:ВызовSubclass()Конструктор BaseClass(по умолчанию)Конструктор Subclass(по умолчанию)Вызов S u b c l a s s ( 1 ,2)КонструкторBaseClass(1)Конструктор Subclass(1,2)Нажмите < E n t e r > д л я з а в е р ш е н и я п р о г р а м м ы .
. .Э т а в е р с и я д е м о н с т р а ц и о н н о й п р о г р а м м ы н а ч и н а е т с я т а к ж е , к а к и п р е д ы д у щ и е при!м е р ы — с создания объекта S u b c l a s s с п р и м е н е н и е м конструкторов по умолчанию какдля класса S u b c l a s s , так и для B a s e C l a s s .Второй объект создается при п о м о щ и выражения n e wS u b c l a s s ( 1 , 2 ) .