.NET 中的跨语言继承简介。
.NET 的引入使语言开发变得比以往更加简单。我们不再需要担心在 C++ 中使用 ATL 包装器来访问 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 的语言的组件,并且在调试时,您可以单步执行同一应用程序中组件之间以及语言之间的函数调用。不同语言的异常处理也是一致的。如果一种语言的组件抛出异常,则可以由另一种语言编写的代码捕获并处理该异常。最重要的是,它允许您和您的团队自由选择他们希望使用的工作语言。
2001 年 10 月 16 日 - 更新为 beta 2