Абстрактные базовые классы. Пример: класс CollectionBase.
Первая ключевая строка расположена внутри конструктора, который теперь должен вызывать конструктор абстрактного базового класса для того, чтобы правильно задать имя. Во втором выделенном фрагменте определяется элементарная реализация для свойства Taxld, объявленного с ключевым словом MustOverride (в приведенном примере новое значение свойства не проверяется, как следовало бы сделать в практическом примере).
Ниже приведена процедура Sub Main, предназначенная для тестирования этой программы:
Sub Main() Dim tom As New Employee("Tom". 50000. "111-11-1234") Dim sally As New Programmed "Sally", 150000. "111-11-2234".) Console.Wri teLi ne(sa1ly.TheName) Dim ourEmployees(l) As Employee ourEmployees(0) = tom ourEmployees(l) = sally Dim anEmployee As Employee For Each anEmployee In ourEmployees anEmployee.RaiseSalary(0.lD) Console.WriteLine(anEmployee.TheName & "has tax id " & _ anEmployee.TaxID & ".salary now is " & anEmployee.Salary()) Next Console.ReadLine() End Sub
В программе невозможно создать экземпляр класса, объявленного с ключевым словом Mustlnherit. Например, при попытке выполнения следующей команды:
Dim NoGood As New PayableEntity("can't do")
Компилятор выводит сообщение об ошибке:
Class 'PayableEntity' is not creatable because it contains at least one member marked as 'MustOverride' that hasn't been overridden.
Тем не менее объект производного класса можно присвоить переменной или контейнеру абстрактного базового класса, что дает возможность использовать в программе полиморфные вызовы:
Dim torn As New Employee("Tom". 50000, "123-45-6789") Dim whoToPay(13) As PayableEntity whoToPay(0) = tom
Примечание
Теоретически класс Mustlnherit может не содержать ни одного члена с ключевым словом MustOverride (хотя это будет выглядеть несколько странно).
Пример: класс CollectionBase
При использовании классов коллекций .NET Framework (таких, как ArrayList и HashTable) возникает неожиданная проблема: эти классы предназначены для хранения обобщенного типа Object, поэтому прочитанные из них объекты всегда приходится преобразовывать к исходному типу функцией СType. Также возникает опасность того, что кто-нибудь сохранит в контейнере объект другого типа и попытка вызова СType завершится неудачей. Проблема решается использованием коллекций с сильной типизацией – контейнеров, позволяющих хранить объекты конкретного типа и типов, производных от него.
Хорошим примером абстрактного базового класса .NET Framework является класс CollectionBase. Классы, производные от CollectionBase, используются для построения коллекций с сильной типизацией (прежде чем создавать собственные классы коллекций, производные от CollectionBase, убедитесь в том, что нужные классы отсутствуют в пространстве имен System.Collections.Specialized). Коллекции, безопасные по отношению к типам, строятся на основе абстрактного базового класса System.Collections.CollectionBase; от вас лишь требуется реализовать методы Add и Remove, а также свойство Item. Хранение данных во внутреннем списке реализовано на уровне класса System.Collections.CollectionBase, который и выполняет все остальные операции.