По просьбам трудящихся.
Наследование один из основных принципов объекто ориентированного программирования. Кроме того, к ним относят инкапсуляцию, что в VB реализовано в виде классов, и полиморфизм. Последнее является следствием наследования, а т.к. оно в VB реализовано безобразно, то можно считать, что его тоже нет.
Что даёт наследование? В нормальной реализации очень многое. Объект-детёныш наследует все св-ва, методы и события родительского объекта. Т.о. для расширения интерфейса класса, например TextBox, достаточно объявить его наследником уже существующего и дописать свои необходимые новые св-ва, методы и/или события.
Как это реализовано в VB? В VB не достаточно просто объявить класс-родитель. Необходимо ещё, кроме того, декларировать и переобъявить все его св-ва, методы и события. Т.е. если объект имеет 33 св-ва (n), то их все необходимо переобъявить. И если в интерфейсе объекта-детёныша они же должны присутствовать, то их нужно задекларировать. Т.о. вместо дописывания одной-двух (m) необходимых функций, вынуждены написать их 2*n+m (в данном примере 33*2+2=68 ) штук, что уже само по себе не доставляет удовольствия от использования такого механизма. А учитывая, что практически каждое св-во представлено парами Get/Let(Set), то кол-во работы удваивается. Но ещё хуже то, что приходится угадывать как работает то или иное св-во объекта-родителя, чтобы полностью имитировать те св-ва, которые изменять нежелательно.
Малюсенький пример:
Class1
- Код: Выделить всё
Option Explicit
Private miIndex As Long
Public Property Get Index() As Long
Index = miIndex
End Property
Public Property Let Index(ByVal newValue As Long)
miIndex = Index
End Property
Class2
- Код: Выделить всё
Option Explicit
Implements Class1
Private moClass1 As New Class1
Private msValue As String
'переопределяем св-ва объекта-родителя
Private Property Let Class1_Index(ByVal RHS As Long)
moClass1.Index = RHS
End Property
Private Property Get Class1_Index() As Long
Class1_Index = moClass1.Index
End Property
'декларируем идентичные св-ва в нашем объекте
Public Property Let Index(ByVal newValue As Long)
moClass1.Index = newValue
End Property
Public Property Get Index() As Long
Index = moClass1.Index
End Property
'и, наконец, дописываем собственное св-во
Public Property Let Value(ByVal newValue As String)
msValue = newValue
End Property
Public Property Get Value() As String
Value = msValue
End Property
И это только для объекта с одним св-ом с заранее известным поведением. Исходя из вышеизложенного, делаем выводы и пользуемся заветной комбинацией ^C ^V, что экономит время и нервы.
Ниже расширенный пример недавно стянутый с какого-то сайта