Пошаговое руководство. Реализация наследования с использованием COM-объектов (Visual Basic)

Классы Visual Basic можно наследить из Public классов в COM-объектах, даже тех, которые созданы в более ранних версиях Visual Basic. Свойства и методы классов, унаследованных от com-объектов, можно переопределить или перезагрузить так же, как свойства и методы любого другого базового класса могут быть переопределены или перегружены. Наследование от COM-объектов полезно при наличии существующей библиотеки классов, которую не требуется перекомпилировать.

В следующей процедуре показано, как использовать Visual Basic 6.0 для создания COM-объекта, содержащего класс, а затем использовать его в качестве базового класса.

Примечание.

Отображаемые на компьютере имена или расположения некоторых элементов пользовательского интерфейса Visual Studio могут отличаться от указанных в следующих инструкциях. Это зависит от имеющегося выпуска Visual Studio и используемых параметров. Дополнительные сведения см. в разделе Персонализация среды IDE.

Создание COM-объекта, используемого в этом пошаговом руководстве

  1. В Visual Basic 6.0 откройте новый проект БИБЛИОТЕКи DLL ActiveX. Создается проект Project1 . Он имеет класс с именем Class1.

  2. В Обозреватель проекта щелкните правой кнопкой мыши Project1 и выберите пункт "Свойства Project1". Откроется диалоговое окно "Свойства проекта".

  3. На вкладке "Общие" диалогового окна "Свойства проекта" измените имя проекта, введя ComObject1 в поле "Имя проекта".

  4. В Обозреватель проекта щелкните правой кнопкой мыши Class1и выберите пункт "Свойства". Откроется окно "Свойства" для класса.

  5. Измените значение свойства Name на MathFunctions.

  6. В Обозреватель проекта щелкните правой кнопкой мыши MathFunctionsи выберите команду "Просмотреть код". Отображается редактор кода.

  7. Добавьте локальную переменную для хранения значения свойства:

    ' Local variable to hold property value
    Private mvarProp1 As Integer
    
  8. Добавление процедур свойств Let и свойств Get :

    Public Property Let Prop1(ByVal vData As Integer)
       'Used when assigning a value to the property.
       mvarProp1 = vData
    End Property
    Public Property Get Prop1() As Integer
       'Used when retrieving a property's value.
       Prop1 = mvarProp1
    End Property
    
  9. Добавьте функцию:

    Function AddNumbers(
       ByVal SomeNumber As Integer,
       ByVal AnotherNumber As Integer) As Integer
    
       AddNumbers = SomeNumber + AnotherNumber
    End Function
    
  10. Создайте и зарегистрируйте COM-объект, нажав кнопку "Сделать ComObject1.dll" в меню "Файл ".

    Примечание.

    Хотя вы также можете предоставить класс, созданный с помощью Visual Basic в качестве COM-объекта, он не является истинным COM-объектом и не может использоваться в этом пошаговом руководстве. Дополнительные сведения см. в статье о взаимодействии COM в приложениях платформа .NET Framework.

Сборки взаимодействия

В следующей процедуре вы создадите сборку взаимодействия, которая выступает в качестве моста между неуправляемым кодом (например, com-объектом) и использует управляемый код Visual Studio. Сборка взаимодействия, которая создает Visual Basic, обрабатывает многие детали работы с COM-объектами, такими как маршаллинг взаимодействия, процесс упаковки параметров и возврат значений в эквивалентные типы данных при переходе к объектам COM и из них. Ссылка в приложении Visual Basic указывает на сборку взаимодействия, а не фактический COM-объект.

Использование COM-объекта с Visual Basic 2005 и более поздними версиями

  1. Откройте новый проект приложения Windows на Visual Basic.

  2. В меню Проект выберите пункт Добавить ссылку.

    Появится диалоговое окно Добавление ссылки.

  3. На вкладке COM дважды щелкните ComObject1 список "Имя компонента" и нажмите кнопку "ОК".

  4. В меню Проект выберите Добавить новый элемент.

    Откроется диалоговое окно Добавление нового элемента .

  5. В области "Шаблоны" нажмите кнопку "Класс".

    Имя Class1.vbфайла по умолчанию отображается в поле "Имя ". Измените это поле на MathClass.vb и нажмите кнопку "Добавить". При этом создается класс с именем MathClassи отображается его код.

  6. Добавьте следующий код в верхнюю часть MathClass , чтобы наследовать от класса COM.

    ' The inherited class is called MathFunctions in the base class,
    ' but the interop assembly appends the word Class to the name.
    Inherits ComObject1.MathFunctionsClass
    
  7. Перегрузите общедоступный метод базового класса, добавив следующий код MathClassв:

    '  This method overloads the method AddNumbers from the base class.
    Overloads Function AddNumbers(
        ByVal SomeNumber As Integer,
        ByVal AnotherNumber As Integer) As Integer
    
        Return SomeNumber + AnotherNumber
    End Function
    
  8. Расширьте унаследованный класс, добавив следующий код MathClass:

    '  The following function extends the inherited class.
    Function SubtractNumbers(
        ByVal SomeNumber As Integer,
        ByVal AnotherNumber As Integer) As Integer
    
        Return AnotherNumber - SomeNumber
    End Function
    

Новый класс наследует свойства базового класса в com-объекте, перегружает метод и определяет новый метод для расширения класса.

Тестирование наследуемого класса

  1. Добавьте кнопку в форму запуска, а затем дважды щелкните ее, чтобы просмотреть код.

  2. В процедуре обработчика Click событий кнопки добавьте следующий код для создания экземпляра MathClass и вызова перегруженных методов:

    Dim Result1 As Short
    Dim Result2 As Integer
    Dim Result3 As Integer
    Dim MathObject As New MathClass
    Result1 = MathObject.AddNumbers(4S, 2S) ' Add two Shorts.
    Result2 = MathObject.AddNumbers(4, 2) 'Add two Integers.
    Result3 = MathObject.SubtractNumbers(2, 4) ' Subtract 2 from 4.
    MathObject.Prop1 = 6 ' Set an inherited property.
    
    MsgBox("Calling the AddNumbers method in the base class " &
           "using Short type numbers 4 and 2 = " & Result1)
    MsgBox("Calling the overloaded AddNumbers method using " &
           "Integer type numbers 4 and 2 = " & Result2)
    MsgBox("Calling the SubtractNumbers method " &
           "subtracting 2 from 4 = " & Result3)
    MsgBox("The value of the inherited property is " &
            MathObject.Prop1)
    
  3. Запустите проект, нажав клавишу F5.

При нажатии кнопки в форме AddNumbers метод сначала вызывается с Short номерами типов данных, а Visual Basic выбирает соответствующий метод из базового класса. Второй вызов AddNumbers направляется к методу перегрузки.MathClass Третий SubtractNumbers вызов вызывает метод, который расширяет класс. Свойство в базовом классе задано, и отображается значение.

Next Steps

Возможно, вы заметили, что перегруженная функция, как представляется, имеет тот же тип данных, что и метод, унаследованный AddNumbers от базового класса объекта COM. Это связано с тем, что аргументы и параметры метода базового класса определяются как 16-разрядные целые числа в Visual Basic 6.0, но они предоставляются в виде 16-разрядных целых чисел типа Short в более поздних версиях Visual Basic. Новая функция принимает 32-разрядные целые числа и перегружает функцию базового класса.

При работе с COM-объектами убедитесь, что вы проверяете размер и типы данных параметров. Например, при использовании COM-объекта, который принимает объект коллекции Visual Basic 6.0 в качестве аргумента, нельзя предоставить коллекцию из более поздней версии Visual Basic.

Свойства и методы, унаследованные от классов COM, можно переопределить, то есть можно объявить локальное свойство или метод, заменяющий свойство или метод, унаследованный от базового КЛАССА COM. Правила переопределения унаследованных свойств COM аналогичны правилам переопределения других свойств и методов со следующими исключениями:

  • При переопределении любого свойства или метода, унаследованного от класса COM, необходимо переопределить все остальные унаследованные свойства и методы.

  • Свойства, использующие ByRef параметры, нельзя переопределить.

См. также