-
В предыдущей главе кратко упоминались два столпа объектно-ориентированного программирования в VB.NET: наследование реализации, обеспечивающее возможность многократного использования кода, и наследование интерфейсов, то есть "контракт", которому должны соответствовать некоторые аспекты поведения класса. Обе разновидности наследования будут подробно рассмотрены в этой главе.
-
Начнем с повторения некоторых терминов. Класс, взятый за основу при определении нового класса, называется базовым классом. Класс, определяемый на основе базового класса, называется производным классом.
-
В VB.NET существует модификатор Protected, который автоматически предоставляет доступ из производных классов к соответствующему члену класса, будь то метод или переменная класса. Возникает искушение воспользоваться этим модификатором и объявить все поля базового класса с уровнем доступа Protected, чтобы производные классы могли легко и быстро работать с ними. Не поддавайтесь соблазну!
-
В нашем примере, где программист автоматически получает 6-процентное повышение зарплаты вместо 5-процентного, необходимо изменить поведение метода RaiseSalary и отразить в нем автоматическую надбавку. Это называется переопределением функции. | Примечание | Общие члены классов переопределяться не могут.
-
Предположим, вы построили замечательную объектно-ориентированную систему учета кадров, в которой в полной мере используются все преимущества полиморфизма. А теперь попробуйте ответить на простой вопрос – как в вашей системе реализован перевод простого работника в менеджеры?
-
Наследование часто помогает избавиться от громоздких конструкций Select Case и If-Then-Else, чтобы вся черновая работа выполнялась компилятором и механизмом полиморфизма. Например, цикл из следующего фрагмента работает как с экземплярами класса Employee, так и с экземплярами Programmer: | Sub Maln() | Dim tom As New Employee("Tom".
-
Термин "замещение" (shadowing) встречался и в ранних версиях VB, и в большинстве языков программирования. Локальная переменная, имя которой совпадает с именем переменной, обладающей более широкой областью видимости, замещает (скрывает) эту переменную.
-
На стадии проектирования наследственных связей в программе часто выясняется, что многие классы обладают целым рядом сходных черт. Например, внештатные сотрудники не относятся к постоянным работникам, но и те и другие обладают рядом общих атрибутов – именем, адресом, кодом налогоплательщика и т. д.
-
Вся работа .NET Framework (а следовательно, и VB.NET) основана на том, что каждый тип является производным от корневого класса Object, общего предка всех классов (в ООП такие классы иногда называются космическими (space) базовыми классами).
-
В классе Object поддерживаются две версии Equals – общая и обычная. Общая версия имеет следующий синтаксис: | Overloads Public Shared Function Equals(0bject.
-
Каждый тип .NET Framework представлен объектом Type. Класс Type содержит множество методов со сложными именами – например, метод GetMembers возвращает информацию об именах всех методов заданного класса.
-
В программировании, как и в современной науке: | Клоном называется точная копия объекта. | Состояние клона может измениться и стать отличным от состояния исходного объекта. | Но самое важное правило клонирования формулируется так:
-
Проблема несовместимости компонентов хорошо известна всем, кому доводилось программировать для Windows. Обычно она выступает в форме так называемого кошмара DLL (DLL Hell) – программа использует определенную версию DLL, a потом установка новой версии компонента нарушает работу программы. Почему?
-
Вероятно, вы убедились в том, что наследование занимает важное место в VB.NET, но для полноценного использования объектно-ориентированных средств VB.NET вам также придется освоить реализацию интерфейсов. Этой важной теме посвящены несколько ближайших разделов.
-
Во многих компаниях, занимающихся программированием (хотя бы в Microsoft), существует должность ведущего программиста или ведущего специалиста по тестированию. Предположим, вы решили расширить систему учета кадров и включить в нее эти новые должности с особыми свойствами – скажем, наличием фонда материального поощрения для особо отличившихся подчиненных.
-
Хотя на первый взгляд интерфейсы чем-то напоминают базовые классы, от этой аналогии больше вреда, чем пользы. Абстрактный класс может содержать реализованные методы, а в интерфейсе они недопустимы. Абстрактные базовые классы создаются только в результате тщательного анализа функциональности с выделением самого примитивного общего предка, и ни по какой другой причине.
-
Коллекцией (collection) называется объект, предназначенный для хранения других объектов. Коллекция содержит методы для включения и удаления внутренних объектов, а также обращения к ним в разных вариантах – от простейшей индексации, как при работе с массивами, до сложной выборки по ключу, как в классе Hashtable, представленном в предыдущей главе.
-
Интерфейс ICollection определяется производным от IEnumerable; он дополняет этот интерфейс тремя свойствами, доступными только для чтения, и одним новым методом. Класс ICollection редко реализуется самостоятельно. Как правило, он образует базу для интерфейсов IList и IDictionary (см. ниже).
-
Интерфейс IDictionary представляет коллекцию, в которой доступ к данным осуществляется по ключу – как в хэш-таблицах, описанных в предыдущей главе. Более того, класс хэш-таблиц в числе прочих реализует интерфейсы IDictionary, ICollection, Enumerable и ICloneable!
-
Предположим, коллекцию объектов Employee потребовалось отсортировать по заработной плате. Конечно, операцию сортировки было бы удобно реализовать непосредственно в классе Emplоуее, чтобы сортировка простого или динамического массива объектов этого класса выполнялась так же просто, как сортировка строковых массивов.
-
.NET Framework позволяет выполнять сортировку по нескольким критериям. Например, чтобы упорядочить массив работников сначала по заработной плате, а затем по имени (в группах с одинаковой зарплатой) следует реализовать интерфейс IComparer, содержащий единственный метод СотрагеТо.