.NET における言語間継承の概要。
.NET の導入により、言語開発がこれまでより簡単になりました。 C++ で ATL ラッパーを使用して VB コンポーネントにアクセスしたり、FORTRAN コードとのインターフェイスを試みるときに規約を呼び出したりすることを心配する必要がなくなりました。すべての .NET 対応言語は現在、ファーストクラスのエンティティであり、シームレスに相互運用できるため、異種システムがこれまでより簡単に連携できるようになり、異なるスキルセットを持つ開発者がプロジェクトで調和して連携できるようになります。
ある言語で別の言語で使用できるコンポーネントを作成するのは非常に簡単です。 Visual Studio.NET ウィザードを使用して、お気に入りの .NET 言語でクラス ライブラリを作成し、コンパイルすれば完了です。
たとえば、2 つのメソッドを公開する単純なクラスを 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
文字列オブジェクトを受け取り、その長さを返します。 2 番目のメソッドは仮想メソッドで、渡された数値の 2 乗を返します。このコンポーネントをMyCSClass.dllにコンパイルしたと仮定します。
マネージド C++ を使用してこのコンポーネントを使用するには、まずアセンブリをプログラムにインポートする必要があります。
# using " MyCSClass.dll "
それでおしまい。 typelib、.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
言語間の相互運用性は、単に異なる言語で書かれたコンポーネントの使用を容易にするだけではありません。コンポーネントの元のソース コードを必要とせずに、他の言語で書かれたコンポーネントから新しいクラスを継承することもできます。
気に入って使っている超クールなコンポーネントを購入または入手したものの、もう 1 つまたは 2 つ機能があればいいのに、または少し違う機能があればいいのにと思っていると想像してください。 .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# クラスの仮想メソッドをオーバーライドし、非仮想MyMethod()
関数を持つ新しい C++ コンポーネントが作成されます。
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# コンポーネントと、C++ コンポーネントによって使用され、継承される VB.NET コンポーネントが含まれています。
言語間の相互運用性により、オブジェクト指向の方法で独自の機能を使用してサードパーティのコンポーネントを拡張できます。 CLS 準拠言語のコンポーネントを簡単に操作でき、デバッグ時に、同じアプリケーション内のコンポーネント間および言語間の関数呼び出しをステップ実行できます。例外処理も言語間で一貫しています。ある言語のコンポーネントが例外をスローした場合、その例外は別の言語で書かれたコードでキャッチして処理できます。最も重要なことは、あなたとあなたのチームが作業に使用したい言語を自由に選択できることです。
2001 年 10 月 16 日 - ベータ 2 用に更新