مقدمة إلى الميراث عبر اللغات في .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 "
هذا كل شيء. لا يوجد typelibs ولا ملفات .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 - تم التحديث للنسخة التجريبية الثانية