لماذا لا يمكنني إنشاء فئة فرعية جديدة واستخدامها في نفس الجملة؟
سؤال
أتساءل لماذا لا يعمل ما يلي في GNU Smalltalk:
Object subclass: Foo [ ] new printNl
كنت أتوقع نسخة مطبوعة من شيء مثل "a Foo"، ولكن بدلاً من ذلك يطبع GST "لا شيء".ألا يبدو هذا غريبا بعض الشيء؟
المحلول
Object subclass: Foo []
ليس بناء جملة Smalltalk "معتادًا"، بل هو إضافة حديثة مصممة لجعل عملية تشفير الملفات عملية.قبل ذلك لم يكن هناك بناء جملة مخصص للإعلان عن الفئة، حيث سيتم إنشاؤها بواسطة أمر في الصورة.تفسير هذا الرمز كما توقعت سيكون خاطئًا لعدة أسباب:
أولا، إذا
subclass:
كانت رسالة حقيقية تم إرسالها إلىObject
, ، ثمFoo
يجب أن يحل شيئًا ما، وهو أمر غير ممكن لأنه تم الإعلان عنه للتو.ومع ذلك، وراء الكواليس، يقوم المترجم بشيء مماثلObject subclass: #Foo
أين#Foo
هو رمز لاسم فئة جديدة سيتم إنشاؤها.سيكون من الممكن كتابة كل التعليمات البرمجية بهذه الطريقة، إلا أنه لا يمكنك استخدام أسماء الفئات مباشرة (نظرًا لأنها غير موجودة بعد عند قراءة التعليمات البرمجية).سيكون عليك أن تفعل(Smalltalk at: #Foo) new printNl
في انحاء المكان.وبالتالي فإن النموذج كلهObject subclass: Foo [ ]
هو بناء جملة خالص يعلن فقط أنه يجب إنشاء هذه الفئة، ولا يعني أنه في هذه اللحظة يجب إرسال رسالة إلىObject
, ، إلخثانيًا، لا ترغب في إنشاء فئات في وسط خوارزمية وإرسال رسائل إليها على الفور، فهذا سيكون أمرًا قبيحًا جدًا كممارسة تطوير.لاحظ أنه يجب تسجيل الفئات في النظام حتى يتمكن المتصفح من عرضها، ويمكن للمترجم إعادة ترجمة التبعيات تلقائيًا، ويمكن للتحكم في الإصدار تسجيلها، وما إلى ذلك.أيضًا، ماذا لو قام الكود الخاص بك بتشغيل هذا مرتين عن طريق الخطأ؟هل يجب أن تحصل على درجة ثانية من Foo وتنسى الدرجة السابقة؟لذلك، عادة، يقوم المترجم والمتصفح وأدوات البرمجة الوصفية الأخرى فقط بإنشاء فئات جديدة، وفقط بناءً على طلب المبرمج.
نصائح أخرى
ويتم تفسير ذلك بأنه بيانين. الأول هو
وجوه فئة فرعية: فو []
والثاني هو
وprintNl الجديدة
وحيث تكون غير معرفة المتغير الجديد لذلك هو لا شيء.