Eine Einführung in die sprachübergreifende Vererbung in .NET.
Die Einführung von .NET macht die Sprachentwicklung einfacher als je zuvor. Wir müssen uns nicht mehr um die Verwendung von ATL-Wrappern in C++ für den Zugriff auf VB-Komponenten oder um Aufrufkonventionen kümmern, wenn wir versuchen, eine Schnittstelle mit FORTRAN-Code herzustellen. Alle .NET-fähigen Sprachen sind jetzt erstklassige Einheiten und arbeiten nahtlos zusammen, sodass unterschiedliche Systeme einfacher als je zuvor zusammenarbeiten können und Entwickler mit unterschiedlichen Fähigkeiten harmonisch an Projekten zusammenarbeiten können.
Das Erstellen einer Komponente in einer Sprache, die von einer anderen Sprache verwendet werden kann, ist sehr einfach. Erstellen Sie mit dem Visual Studio.NET-Assistenten eine Klassenbibliothek in Ihrer bevorzugten .NET-Sprache, kompilieren Sie sie, und schon sind Sie fertig.
Beispielsweise erstellen wir eine einfache Klasse in C#, die zwei Methoden verfügbar macht:
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;
}
}
}
Die erste Methode, MyMethod
, nimmt ein String-Objekt und gibt seine Länge zurück. Die zweite Methode ist virtuell und gibt das Quadrat der übergebenen Zahl zurück. Gehen Sie davon aus, dass wir diese Komponente zu MyCSClass.dll kompiliert haben.
Um diese Komponente mit verwaltetem C++ zu nutzen, müssen wir zuerst die Assembly in unser Programm importieren:
# using " MyCSClass.dll "
Das ist es. Keine Typelibs, keine .def-Dateien, keine ATL-Header. Wir verwenden einfach die #using
-Anweisung (und stellen sicher, dass sich die DLL im Suchpfad des Compilers befindet) und lassen den Compiler den Rest erledigen.
Sobald wir die Klasse importiert haben, können wir die using
-Deklaration verwenden, um Tipparbeit zu sparen:
using namespace MyCSClass ;
Beachten Sie hier den Unterschied: #using
dient zum Importieren einer Baugruppe in Ihr Projekt. using
gibt den Namespace an, mit dem wir arbeiten werden, und erspart lediglich die Eingabe.
Die tatsächliche Verwendung der Klasse ist dasselbe wie die Verwendung eines anderen verwalteten Referenztyps in .NET:
CSClass *cs = new CSClass();
int result;
result = cs-> MyMethod ( " Hello World " ); // will return 11
result = cs-> MyVirtualMethod ( 2 ); // will return 2 squared
Die sprachübergreifende Interoperabilität geht über die einfache Vereinfachung der Verwendung von Komponenten hinaus, die in verschiedenen Sprachen geschrieben sind. Wir können auch neue Klassen von in anderen Sprachen geschriebenen Komponenten erben, ohne den ursprünglichen Quellcode für die Komponente zu benötigen .
Stellen Sie sich vor, Sie haben eine supercoole Komponente gekauft oder auf andere Weise erworben, die Sie gerne verwenden, von der Sie sich aber wünschen, dass sie ein oder zwei weitere Funktionen hätte oder dass sie etwas anderes macht. In .NET können Sie eine neue Klasse von dieser Komponente erben, um eine neue Komponente zu erstellen, die genau so funktioniert, wie Sie es möchten. Sie erstellen keinen Wrapper für die Komponente: Sie erstellen eine neue Komponente, die ihre Eigenschaften, Methoden und Felder ableitet und die die virtuellen Methoden der alten Komponente überschreiben und neue Methoden hinzufügen kann.
Zurück zu unserem Beispiel. Die Methode CSClass::MyVirtualMethod
ist virtuell. Daher deklarieren wir eine neue C++-Klasse, die von dieser C#-Klasse abgeleitet ist, und überschreiben diese virtuelle Methode
__gc class CPPClass : public MyCSClass ::CSClass
{
public:
// returns the cube of the given number
virtual int MyVirtualMethod ( int n)
{
return n*n*n;
}
};
Wir haben CSClass::MyVirtualMethod
mit unserer neuen Methode überschrieben, die die Kubikzahl und nicht das Quadrat der angegebenen Zahl zurückgibt. Sobald wir den Code kompiliert haben, haben wir eine neue C++-Komponente, die die virtuelle Methode in der C#-Klasse überschreibt und außerdem über die nicht-virtuelle MyMethod()
-Funktion verfügt.
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
Der zugehörige Download zu diesem Artikel enthält eine C#- und eine VB.NET-Komponente, die von einer C++-Komponente genutzt und von dieser geerbt wird.
Durch die sprachübergreifende Interoperabilität können Sie Komponenten von Drittanbietern objektorientiert um Ihre eigene Funktionalität erweitern. Sie können problemlos mit Komponenten in jeder CLS-kompatiblen Sprache arbeiten und beim Debuggen schrittweise Funktionsaufrufe zwischen Komponenten und Sprachen in derselben Anwendung durchlaufen. Die Ausnahmebehandlung ist auch sprachübergreifend konsistent. Wenn eine Komponente in einer Sprache eine Ausnahme auslöst, kann diese von in einer anderen Sprache geschriebenem Code abgefangen und behandelt werden. Am wichtigsten ist, dass es Ihnen und Ihrem Team die Freiheit gibt, die Sprache zu wählen, in der sie arbeiten möchten.
16. Okt. 2001 – aktualisiert für Beta 2