Каждая из |
версий метода T e s t О вызывает W i t h d r a w () с точки зрения различного |
класса объекта. |
Вывод программы имеет следующий вид: |
Передача |
B a n k A c c o u n t |
вT e s t ( B a n k A c c o u n t )
вы з ы в а е т B a n k A c c o u n t . W i t h d r a w ( )
1ередача |
S a v i n g s A c c o u n t |
вT e s t ( B a n k A c c o u n t )
вы з ы в а е т S a v i n g s A c c o u n t . W i t h d r a w ( )
вT e s t ( S a v i n g s A c c o u n t )
вы з ы в а е т S a v i n g s A c c o u n t . W i t h d r a w ( )
Передача |
S p e c i a l S a l e A c c o u n t |
в Test(BankAccount)
вызывает SavingsAccount.Withdraw()
вT e s t ( S a v i n g s A c c o u n t )
вы з ы в а е т S a v i n g s A c c o u n t . W i t h d r a w ( )
вTest(SpecialSaleAccount)
вызывает SpecialSaleAccount.Withdraw()
Передача |
S a l e S p e c i a l C u s t o m e r |
вT e s t ( B a n k A c c o u n t )
вы з ы в а е т S a v i n g s A c c o u n t . W i t h d r a w ( )
вTest(SavingsAccount)
вызывает SavingsAccount.Withdraw() в Test(SpecialSaleAccount)
вызывает SaleSpecialCustomer.Withdraw()
вT e s t ( S a l e S p e c i a l C u s t o m e r )
в ы з ы в а е т |
S a l e S p e c i a l C u s t o m e r . W i t h d r a w ( ) |
Нажмите < E n t e r > |
д л я з а в е р ш е н и я п р о г р а м м ы . . . |
Полужирным ш р и ф т о м выделены строки, представляющие особый интерес. Классы
BankAccount и S a v i n g s A c c o u n t работают в точности так, как и |
ожидалось. Однако |
при вызове |
T e s t ( S a v i n g s A c c o u n t ) и S p e c i a l S a l e A c c o u n t , |
и S a l e S p e c i a l |
Customer |
передаются |
как |
S a v i n g s A c c o u n t . В то |
же время |
S a l e S p e c i a l C u s |
tomer при |
передаче в |
T e s t |
( S p e c i a l S a l e A c c o u n t ) |
работает как наследник этого |
пасса, т.е. фактически создается новая иерархия наследования.
Создание новой иерархии
Зачем С# поддерживает создание новой иерархии наследования? Неужели обычного полиморфизма недостаточно?
С# формировался как "сетевой" язык в том смысле, что классы при работе програм мы—и даже подклассы — могут быть распределены по сети Интернет. То есть про грамма, которую вы пишете, м о ж е т непосредственно использовать классы из стан дартных хранилищ, расположенных на других компьютерах в Интернете.
Вы можете расширять класс, загруженный из Интернета. Перекрытие методов стан дартной, протестированной иерархии классов может привести к непреднамеренным зффектам. Создание новой иерархии классов позволяет вашим программам пользо ваться всеми преимуществами полиморфизма без опасности разрушения существую щего кода.