سؤال

قرأت عن المُنشئين الافتراضيين يتم استخدامها لتنفيذ بعض أنماط التصميم ، لكنني لم أفهم أي حاجة إلى منشئات افتراضية. إذن ما هي المنشئون الافتراضيون ولماذا نحتاجهم حقًا؟

هل كانت مفيدة؟

المحلول

في معظم لغات البرمجة ، 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top