.NET 中的跨语言继承






4.53/5 (5投票s)
.NET 中跨语言继承的介绍。
引言
.NET 的引入使语言开发比以往任何时候都更简单。我们不再需要担心在 C++ 中使用 ATL 包装器来访问 VB 组件,也不需要在尝试与 FORTRAN 代码交互时考虑调用约定。所有启用 .NET 的语言现在都是一流的实体,并且可以无缝地互操作,从而使不同的系统比以往任何时候都更容易协同工作,并且还允许具有不同技能组合的开发人员在项目上和谐地协同工作。
创建 .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++ 中使用 .NET 组件
要使用托管 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 更新