Основы наследования
Обновлен: Ноябрь 2007
Оператор Inherits используется для объявления нового класса, называемого производным классом, который основан на существующем классе, называемом базовым классом. Производные классы наследуют и могут расширять свойства, методы и события, поля и константы, определенные в базовом классе. В следующем разделе описываются некоторые правила наследования, а также модификаторы, используемые для изменения порядка наследования классом или наследования самого класса.
Все классы могут наследоваться по умолчанию, если только они не помечены зарезервированным словом NotInheritable. Классы могут наследовать из других классов проекта или из классов других сборок, на которые ссылается проект.
В отличие от языков, которые позволяют множественное наследование, Visual Basic позволяет только единичное наследование в классах; то есть производные классы могут иметь только один базовый класс. Хотя в классах не поддерживается множественное наследование, они все же могут реализовывать множественные интерфейсы, которые способны эффективно выполнять те же самые задачи.
Чтобы предотвратить предоставление элементов с ограничениями в базовом классе, тип доступа к производному классу должен быть таким же, как и тип доступа к базовому классу, или более строгим. Например, Public класс не может наследовать Friend или Private класс, а Friend класс не может наследовать Private класс.
Модификаторы наследования
Для поддержки наследования Visual Basic вводит следующие инструкции на уровне класса и модификаторы:
Инструкция Inherits определяет базовый класс.
Модификатор NotInheritableне позволяет использовать класс в качестве базового класса.
Модификатор MustInherit определяет, что класс предназначен только для использования в качестве базового класса. Невозможно создать напрямую экземпляры классов MustInherit; их можно создать только как экземпляры базового класса в производном классе. (Другие языки программирования, такие как C++ и C#, используют термин абстрактный класс для описания такого класса.)
Переопределение свойств и методов в производных классах
По умолчанию производный класс наследует свойства и методы от своего базового класса. Если наследуемое свойство или метод в производном классе должен работать другим образом, то оно может быть переопределено. То есть, в производном классе можно определить новую реализацию метода. Следующие модификаторы используются для управления переопределением свойств и методов.
Overridable позволяет переопределение свойства или метода в производном классе.
Overrides переопределяет Overridable свойство или метод, определенное в базовом классе.
NotOverridable не позволяет переопределять свойство или метод в наследующем классе. По умолчанию Public методы являются NotOverridable.
MustOverride требует обязательного переопределения свойства или метода производным классом. При использовании ключевого слова MustOverride определение метода состоит только из инструкций Sub, Function или Property. Другие инструкции не допускаются, и в частности отсутствуют инструкции End Sub или End Function. MustOverride методы должны объявляться в классах MustInherit.
Дополнительные сведения о переопределенных методах содержатся в разделе Переопределение свойств и методов.
Ключевое слово MyBase
Можно использовать зарезервированное слово MyBase для вызова методов в базовом классе при переопределении методов в производном классе. Например, при разработке производного класса, переопределяющего метод, унаследованный из базового класса, переопределяемый метод может вызвать метод в базовом классе и изменить возвращаемое значение, как показано в следующем фрагменте кода.
Class DerivedClass
Inherits BaseClass
Public Overrides Function CalculateShipping( _
ByVal Dist As Double, _
ByVal Rate As Double) _
As Double
' Call the method in the base class and modify the return value.
Return MyBase.CalculateShipping(Dist, Rate) * 2
End Function
End Class
В следующем списке перечислены ограничения в использовании MyBase.
MyBase относится непосредственно к базовому классу и его унаследованным членам. Его нельзя использовать для доступа к Private членам в классе.
MyBase является зарезервированным словом, а не реальным объектом. MyBase не может быть присвоен переменной, передан в процедуры или использован в сравнении Is.
Метод, квалифицируемый зарезервированным словом MyBase, не требуется определять в соответствующем базовом классе, вместо этого его можно определить в базовом классе, унаследованном косвенным образом. Чтобы ссылка, квалифицируемая зарезервированным словом MyBase, правильно откомпилировалась, один из базовых классов должен содержать метод, сопоставляющий имена и типы параметров, появляющихся в вызове.
Нельзя использовать MyBase для вызова методов MustOverride базового класса.
Нельзя использовать зарезервированное слово MyBase для квалификации самого себя. Таким образом следующий код является недопустимым:
MyBase.MyBase.BtnOK_Click()
Нельзя использовать MyBase в модулях.
Нельзя использовать MyBase для доступа к членам базового класса, помеченным как Friend, если базовый класс находится в другой сборке.
Ключевое слово MyClass
Зарезервированное слово MyClass позволяет вызывать метод Overridable, реализуемый в пользовательском классе, и делать так, чтобы вызывалась реализация метода в данном классе, а не реализация переопределенного метода в производном классе.
MyClass является зарезервированным словом, а не реальным объектом. MyClass не может быть присвоен переменной, передан в процедуры или использован в сравнении Is.
MyClass ссылается на содержащий класс и его унаследованные члены.
MyClass может использоваться в качестве квалификатора для членов Shared.
Нельзя использовать MyClass в стандартных модулях.
MyClass можно использовать для квалификации метода, определенного в базовом классе и не имеющего реализации метода этого класса. Эта ссылка имеет то же самое значение, что и MyBase.Method.
См. также
Задачи
Практическое руководство. Создание производных классов
Основные понятия
Переопределение свойств и методов
Ссылки
Другие ресурсы
Сведения об изменениях в языке (для пользователей Visual Basic 6.0)