أين يتم استخدام المنشآت الافتراضية؟
-
08-07-2019 - |
سؤال
قرأت عن المُنشئين الافتراضيين يتم استخدامها لتنفيذ بعض أنماط التصميم ، لكنني لم أفهم أي حاجة إلى منشئات افتراضية. إذن ما هي المنشئون الافتراضيون ولماذا نحتاجهم حقًا؟
المحلول
في معظم لغات البرمجة ، AFAIK ، لا يمكنك العثور على مُنشئين افتراضيين. يتم تقييم أي تجاوز للأعضاء الظاهريين في وقت التشغيل بعد إنشاء كائن ، ولكن في معظم اللغات التي تحتاج إلى معرفة الفئة الفعلية عند إنشاء المثيل. لذلك لا معنى لها بنيات افتراضية في هذه اللغات.
في .NET ، يمكنك الحصول على حل مماثل من خلال الانعكاس ، أي يمكنك إنشاء كائن من خلال مثيل لفئة النوع التي تمثل الكائن الذي تريد إنشاءه. وبدعم عام ، يمكنك أيضًا تحقيق شيء مشابه ، لكنه ليس مُنشئًا افتراضيًا.
لغة البرمجة الوحيدة التي عملت معها والتي لها مُنشئين افتراضيين حقيقيين هي Delphi. في دلفي ، يوجد "نوع metaclass" محدد ، أي بنية برمجة محددة تمثل metaclass (بينما في .NET ، فئة التعريف ، Type
الفصل ، هو مجرد مثيل للفئة العادية). لذلك إذا كان لديك فصل يسمى TMyClass
- اتفاقيات تسمية Deplhi ؛)
TMyClass : Class ...
يمكنك إعلان metaclass مثل هذا
TMyMetaClass : class of TMyClass
الآن ، يمكنك إعلان متغير TMyMetaClass
يكتب،
MyMetaClassVariable : TMyMetaClass
...
// Assign the meta class to refer to our concrete class
MyMetaClassVariable := TMyClass;
ويمكنك إنشاء مثيل جديد من خلال هذا المتغير
MyClassInstance := MyMetaClassVariable.Create();
الآن ، و MyMetaClassVariable
يمكن أن تشير إلى أي فئة إما TMyClass
أو تخصصها. إذا تم الإعلان عن المُنشئ الظاهري ، فسيتم إنشاء المتغير بمثيل من تلك الفئة المحددة.
بنفس الطريقة ، يمكنك إعلان طرق ثابتة افتراضية في دلفي ، والاتصال بها من خلال مثيل من metaclass.
إذن السؤال الآخر؟ لماذا نحتاجهم؟ حسنًا ، في دلفي ، يحلون بعضًا من نفس المشكلات مثل Type
الفصل في .NET ، مما يتيح لك إنشاء كائنات حيث لا تعرف اسم الفصل في وقت التصميم. على سبيل المثال ، عندما تقوم بتصميم نموذج ووضعها في مجموعة من عناصر التحكم ، يجب أن يتم تصنيف هذه البيانات من قبل المصمم ، وتفضيل. عندما يكون النموذج غير مرغوب فيه ، يكون في الواقع النماذج التي تتم قراءتها ، والحالات الصحيحة (سواء كان ذلك TextBox
, ComboBox
, ، وما إلى ذلك) يتم بناؤها عن طريق استدعاء المُنشئ الظاهري على metatype.