لماذا لا يمكنني إنشاء فئة فرعية جديدة واستخدامها في نفس الجملة؟

StackOverflow https://stackoverflow.com/questions/637956

  •  10-07-2019
  •  | 
  •  

سؤال

أتساءل لماذا لا يعمل ما يلي في 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 الجديدة

وحيث تكون غير معرفة المتغير الجديد لذلك هو لا شيء.

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