Введение в межъязыковое наследование в .NET.
Внедрение .NET делает разработку языка проще, чем когда-либо. Нам больше не нужно беспокоиться об использовании оболочек ATL в C++ для доступа к компонентам VB или соглашениях о вызовах при попытке взаимодействия с кодом FORTRAN. Все языки с поддержкой .NET теперь являются первоклассными сущностями и беспрепятственно взаимодействуют, что позволяет разрозненным системам работать вместе легче, чем когда-либо, а также позволяет разработчикам с разными наборами навыков гармонично работать вместе над проектами.
Создать компонент на одном языке, который может использоваться на другом языке, очень просто. Используйте мастер Visual Studio.NET, чтобы создать библиотеку классов на вашем любимом языке .NET, скомпилировать ее, и все готово.
Например, мы создадим простой класс на C#, который предоставляет два метода:
namespace MyCSClass
{
using System;
public class CSClass
{
public CSClass () { }
// returns the length of the passed string
public int MyMethod (string str)
{
return str. Length ;
}
// returns n squared
virtual public int MyVirtualMethod ( int n)
{
return n*n;
}
}
}
Первый метод MyMethod
принимает строковый объект и возвращает его длину. Второй метод является виртуальным и возвращает квадрат переданного числа. Предположим, что мы скомпилировали этот компонент в MyCSClass.dll .
Чтобы использовать этот компонент с помощью управляемого C++, нам нужно сначала импортировать сборку в нашу программу:
# using " MyCSClass.dll "
Вот и все. Никаких библиотек типов, файлов .def и заголовков ATL. Мы просто используем оператор #using
(и проверяем, что dll находится в пути поиска компилятора) и позволяем компилятору сделать все остальное.
После того, как мы импортировали класс, мы можем использовать объявление using
, чтобы не вводить текст:
using namespace MyCSClass ;
Обратите внимание на разницу: #using
предназначен для импорта сборки в ваш проект. using
указывает пространство имен, с которым мы будем работать, и просто экономит ввод.
Фактически использование класса аналогично использованию любого другого управляемого ссылочного типа в .NET:
CSClass *cs = new CSClass();
int result;
result = cs-> MyMethod ( " Hello World " ); // will return 11
result = cs-> MyVirtualMethod ( 2 ); // will return 2 squared
Межъязыковая совместимость выходит за рамки простого упрощения использования компонентов, написанных на разных языках. Мы также можем наследовать новые классы от компонентов, написанных на других языках, без необходимости использования исходного исходного кода компонента .
Представьте, что вы купили или иным образом приобрели какой-то супер-классный компонент, который вам нравится использовать, но вы хотели бы иметь еще одну или две функции или чтобы он делал что-то немного другое. В .NET вы можете наследовать новый класс от этого компонента, чтобы создать новый компонент, который будет работать именно так, как вам нужно. Вы не создаете оболочку для компонента: вы создаете новый компонент, который наследует его свойства, методы и поля и который может переопределять виртуальные методы старого компонента и добавлять новые методы.
Вернемся к нашему примеру. Метод CSClass::MyVirtualMethod
является виртуальным, поэтому давайте объявим новый класс C++, производный от этого класса C#, и переопределим этот виртуальный метод.
__gc class CPPClass : public MyCSClass ::CSClass
{
public:
// returns the cube of the given number
virtual int MyVirtualMethod ( int n)
{
return n*n*n;
}
};
Мы переопределили CSClass::MyVirtualMethod
нашим новым методом, который возвращает куб, а не квадрат заданного числа. После компиляции кода у нас появляется новый компонент C++, который переопределяет виртуальный метод в классе C#, а также имеет невиртуальную функцию MyMethod()
.
CPPClass *cpp = new CPPClass();
int result;
result = cpp-> MyMethod ( " Hello World " ); // will return 11
result = cpp-> MyVirtualMethod ( 2 ); // Will output 2 cubed, not 2 squared
Сопутствующий загружаемый материал к этой статье содержит компонент C# и VB.NET, который используется и наследуется компонентом C++.
Межъязыковое взаимодействие позволяет расширять сторонние компоненты с помощью собственных функций объектно-ориентированным способом. Вы можете легко работать с компонентами на любом языке, совместимом с CLS, а при отладке вы можете пошагово выполнять вызовы функций между компонентами и между языками в одном приложении. Обработка исключений также одинакова для разных языков. Если компонент на одном языке выдает исключение, его можно перехватить и обработать с помощью кода, написанного на другом языке. Самое главное, что это дает вам и вашей команде свободу выбора языка, на котором они хотят работать.
16 октября 2001 г. — обновлено для бета-версии 2.