Основы наследования

Обновлен: Ноябрь 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.

См. также

Задачи

Практическое руководство. Создание производных классов

Основные понятия

Переопределение свойств и методов

Ссылки

Инструкция Inherits

Другие ресурсы

Сведения об изменениях в языке (для пользователей Visual Basic 6.0)